diff options
Diffstat (limited to 'editor')
216 files changed, 27265 insertions, 6999 deletions
diff --git a/editor/action_map_editor.cpp b/editor/action_map_editor.cpp new file mode 100644 index 0000000000..9949fd8199 --- /dev/null +++ b/editor/action_map_editor.cpp @@ -0,0 +1,1167 @@ +/*************************************************************************/ +/* action_map_editor.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2021 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 "action_map_editor.h" +#include "core/input/input_map.h" +#include "core/os/keyboard.h" +#include "editor/editor_scale.h" +#include "scene/gui/center_container.h" + +///////////////////////////////////////// + +// Maps to 2*axis if value is neg, or + 1 if value is pos. +static const char *_joy_axis_descriptions[JOY_AXIS_MAX * 2] = { + TTRC("Left Stick Left, Joystick 0 Left"), + TTRC("Left Stick Right, Joystick 0 Right"), + TTRC("Left Stick Up, Joystick 0 Up"), + TTRC("Left Stick Down, Joystick 0 Down"), + TTRC("Right Stick Left, Joystick 1 Left"), + TTRC("Right Stick Right, Joystick 1 Right"), + TTRC("Right Stick Up, Joystick 1 Up"), + TTRC("Right Stick Down, Joystick 1 Down"), + TTRC("Joystick 2 Left"), + TTRC("Left Trigger, Sony L2, Xbox LT, Joystick 2 Right"), + TTRC("Joystick 2 Up"), + TTRC("Right Trigger, Sony R2, Xbox RT, Joystick 2 Down"), + TTRC("Joystick 3 Left"), + TTRC("Joystick 3 Right"), + TTRC("Joystick 3 Up"), + TTRC("Joystick 3 Down"), + TTRC("Joystick 4 Left"), + TTRC("Joystick 4 Right"), + TTRC("Joystick 4 Up"), + TTRC("Joystick 4 Down"), +}; + +String InputEventConfigurationDialog::get_event_text(const Ref<InputEvent> &p_event) { + ERR_FAIL_COND_V_MSG(p_event.is_null(), String(), "Provided event is not a valid instance of InputEvent"); + + // Joypad motion events will display slighlty differently than what the event->as_text() provides. See #43660. + Ref<InputEventJoypadMotion> jpmotion = p_event; + if (jpmotion.is_valid()) { + String desc = TTR("Unknown Joypad Axis"); + if (jpmotion->get_axis() < JOY_AXIS_MAX) { + desc = RTR(_joy_axis_descriptions[2 * jpmotion->get_axis() + (jpmotion->get_axis_value() < 0 ? 0 : 1)]); + } + + return vformat("Joypad Axis %s %s (%s)", itos(jpmotion->get_axis()), jpmotion->get_axis_value() < 0 ? "-" : "+", desc); + } else { + return p_event->as_text(); + } +} + +void InputEventConfigurationDialog::_set_event(const Ref<InputEvent> &p_event) { + if (p_event.is_valid()) { + event = p_event; + + // Update Label + event_as_text->set_text(get_event_text(event)); + + Ref<InputEventKey> k = p_event; + Ref<InputEventMouseButton> mb = p_event; + Ref<InputEventJoypadButton> joyb = p_event; + Ref<InputEventJoypadMotion> joym = p_event; + Ref<InputEventWithModifiers> mod = p_event; + + // Update option values and visibility + bool show_mods = false; + bool show_device = false; + bool show_phys_key = false; + + if (mod.is_valid()) { + show_mods = true; + mod_checkboxes[MOD_ALT]->set_pressed(mod->get_alt()); + mod_checkboxes[MOD_SHIFT]->set_pressed(mod->get_shift()); + mod_checkboxes[MOD_COMMAND]->set_pressed(mod->get_command()); + mod_checkboxes[MOD_CONTROL]->set_pressed(mod->get_control()); + mod_checkboxes[MOD_META]->set_pressed(mod->get_metakey()); + + store_command_checkbox->set_pressed(mod->is_storing_command()); + } + + if (k.is_valid()) { + show_phys_key = true; + physical_key_checkbox->set_pressed(k->get_physical_keycode() != 0 && k->get_keycode() == 0); + + } else if (joyb.is_valid() || joym.is_valid() || mb.is_valid()) { + show_device = true; + _set_current_device(event->get_device()); + } + + mod_container->set_visible(show_mods); + device_container->set_visible(show_device); + physical_key_checkbox->set_visible(show_phys_key); + additional_options_container->show(); + + // Update selected item in input list for keys, joybuttons and joyaxis only (since the mouse cannot be "listened" for). + if (k.is_valid() || joyb.is_valid() || joym.is_valid()) { + TreeItem *category = input_list_tree->get_root()->get_children(); + while (category) { + TreeItem *input_item = category->get_children(); + + // has_type this should be always true, unless the tree structure has been misconfigured. + bool has_type = input_item->get_parent()->has_meta("__type"); + int input_type = input_item->get_parent()->get_meta("__type"); + if (!has_type) { + return; + } + + // If event type matches input types of this category. + if ((k.is_valid() && input_type == INPUT_KEY) || (joyb.is_valid() && input_type == INPUT_JOY_BUTTON) || (joym.is_valid() && input_type == INPUT_JOY_MOTION)) { + // Loop through all items of this category until one matches. + while (input_item) { + bool key_match = k.is_valid() && (Variant(k->get_keycode()) == input_item->get_meta("__keycode") || Variant(k->get_physical_keycode()) == input_item->get_meta("__keycode")); + bool joyb_match = joyb.is_valid() && Variant(joyb->get_button_index()) == input_item->get_meta("__index"); + bool joym_match = joym.is_valid() && Variant(joym->get_axis()) == input_item->get_meta("__axis") && joym->get_axis_value() == (float)input_item->get_meta("__value"); + if (key_match || joyb_match || joym_match) { + category->set_collapsed(false); + input_item->select(0); + input_list_tree->ensure_cursor_is_visible(); + return; + } + input_item = input_item->get_next(); + } + } + + category->set_collapsed(true); // Event not in this category, so collapse; + category = category->get_next(); + } + } + } else { + // Event is not valid, reset dialog + event = p_event; + Vector<String> strings; + + // Reset message, promp for input according to which input types are allowed. + String text = TTR("Perform an Input (%s)."); + + if (allowed_input_types & INPUT_KEY) { + strings.append(TTR("Key")); + } + // We don't check for INPUT_MOUSE_BUTTON since it is ignored in the "Listen Window Input" method. + + if (allowed_input_types & INPUT_JOY_BUTTON) { + strings.append(TTR("Joypad Button")); + } + if (allowed_input_types & INPUT_JOY_MOTION) { + strings.append(TTR("Joypad Axis")); + } + + if (strings.size() == 0) { + text = TTR("Input Event dialog has been misconfigured: No input types are allowed."); + event_as_text->set_text(text); + } else { + String insert_text = String(", ").join(strings); + event_as_text->set_text(vformat(text, insert_text)); + } + + additional_options_container->hide(); + input_list_tree->deselect_all(); + _update_input_list(); + } +} + +void InputEventConfigurationDialog::_tab_selected(int p_tab) { + Callable signal_method = callable_mp(this, &InputEventConfigurationDialog::_listen_window_input); + if (p_tab == 0) { + // Start Listening. + if (!is_connected("window_input", signal_method)) { + connect("window_input", signal_method); + } + } else { + // Stop Listening. + if (is_connected("window_input", signal_method)) { + disconnect("window_input", signal_method); + } + input_list_tree->call_deferred("ensure_cursor_is_visible"); + if (input_list_tree->get_selected() == nullptr) { + // If nothing selected, scroll to top. + input_list_tree->scroll_to_item(input_list_tree->get_root()); + } + } +} + +void InputEventConfigurationDialog::_listen_window_input(const Ref<InputEvent> &p_event) { + // Ignore if echo or not pressed + if (p_event->is_echo() || !p_event->is_pressed()) { + return; + } + + // Ignore mouse + Ref<InputEventMouse> m = p_event; + if (m.is_valid()) { + return; + } + + // Check what the type is and if it is allowed. + Ref<InputEventKey> k = p_event; + Ref<InputEventJoypadButton> joyb = p_event; + Ref<InputEventJoypadMotion> joym = p_event; + + int type = k.is_valid() ? INPUT_KEY : joyb.is_valid() ? INPUT_JOY_BUTTON : + joym.is_valid() ? INPUT_JOY_MOTION : + 0; + + if (!(allowed_input_types & type)) { + return; + } + + if (joym.is_valid()) { + float axis_value = joym->get_axis_value(); + if (ABS(axis_value) < 0.9) { + // Ignore motion below 0.9 magnitude to avoid accidental touches + return; + } else { + // Always make the value 1 or -1 for display consistency + joym->set_axis_value(SGN(axis_value)); + } + } + + if (k.is_valid()) { + k->set_pressed(false); // to avoid serialisation of 'pressed' property - doesn't matter for actions anyway. + // Maintain physical keycode option state + if (physical_key_checkbox->is_pressed()) { + k->set_physical_keycode(k->get_keycode()); + k->set_keycode(0); + } else { + k->set_keycode(k->get_physical_keycode()); + k->set_physical_keycode(0); + } + } + + Ref<InputEventWithModifiers> mod = p_event; + if (mod.is_valid()) { + // Maintain store command option state + mod->set_store_command(store_command_checkbox->is_pressed()); + + mod->set_window_id(0); + } + + _set_event(p_event); + set_input_as_handled(); +} + +void InputEventConfigurationDialog::_search_term_updated(const String &) { + _update_input_list(); +} + +void InputEventConfigurationDialog::_update_input_list() { + input_list_tree->clear(); + + TreeItem *root = input_list_tree->create_item(); + String search_term = input_list_search->get_text(); + + bool collapse = input_list_search->get_text().is_empty(); + + if (allowed_input_types & INPUT_KEY) { + TreeItem *kb_root = input_list_tree->create_item(root); + kb_root->set_text(0, TTR("Keyboard Keys")); + kb_root->set_icon(0, icon_cache.keyboard); + kb_root->set_collapsed(collapse); + kb_root->set_meta("__type", INPUT_KEY); + + for (int i = 0; i < keycode_get_count(); i++) { + String name = keycode_get_name_by_index(i); + + if (!search_term.is_empty() && name.findn(search_term) == -1) { + continue; + } + + TreeItem *item = input_list_tree->create_item(kb_root); + item->set_text(0, name); + item->set_meta("__keycode", keycode_get_value_by_index(i)); + } + } + + if (allowed_input_types & INPUT_MOUSE_BUTTON) { + TreeItem *mouse_root = input_list_tree->create_item(root); + mouse_root->set_text(0, TTR("Mouse Buttons")); + mouse_root->set_icon(0, icon_cache.mouse); + mouse_root->set_collapsed(collapse); + mouse_root->set_meta("__type", INPUT_MOUSE_BUTTON); + + MouseButton mouse_buttons[9] = { MOUSE_BUTTON_LEFT, MOUSE_BUTTON_RIGHT, MOUSE_BUTTON_MIDDLE, MOUSE_BUTTON_WHEEL_UP, MOUSE_BUTTON_WHEEL_DOWN, MOUSE_BUTTON_WHEEL_LEFT, MOUSE_BUTTON_WHEEL_RIGHT, MOUSE_BUTTON_XBUTTON1, MOUSE_BUTTON_XBUTTON2 }; + for (int i = 0; i < 9; i++) { + Ref<InputEventMouseButton> mb; + mb.instance(); + mb->set_button_index(mouse_buttons[i]); + String desc = get_event_text(mb); + + if (!search_term.is_empty() && desc.findn(search_term) == -1) { + continue; + } + + TreeItem *item = input_list_tree->create_item(mouse_root); + item->set_text(0, desc); + item->set_meta("__index", mouse_buttons[i]); + } + } + + if (allowed_input_types & INPUT_JOY_BUTTON) { + TreeItem *joyb_root = input_list_tree->create_item(root); + joyb_root->set_text(0, TTR("Joypad Buttons")); + joyb_root->set_icon(0, icon_cache.joypad_button); + joyb_root->set_collapsed(collapse); + joyb_root->set_meta("__type", INPUT_JOY_BUTTON); + + for (int i = 0; i < JOY_BUTTON_MAX; i++) { + Ref<InputEventJoypadButton> joyb; + joyb.instance(); + joyb->set_button_index(i); + String desc = get_event_text(joyb); + + if (!search_term.is_empty() && desc.findn(search_term) == -1) { + continue; + } + + TreeItem *item = input_list_tree->create_item(joyb_root); + item->set_text(0, desc); + item->set_meta("__index", i); + } + } + + if (allowed_input_types & INPUT_JOY_MOTION) { + TreeItem *joya_root = input_list_tree->create_item(root); + joya_root->set_text(0, TTR("Joypad Axes")); + joya_root->set_icon(0, icon_cache.joypad_axis); + joya_root->set_collapsed(collapse); + joya_root->set_meta("__type", INPUT_JOY_MOTION); + + for (int i = 0; i < JOY_AXIS_MAX * 2; i++) { + int axis = i / 2; + int direction = (i & 1) ? 1 : -1; + Ref<InputEventJoypadMotion> joym; + joym.instance(); + joym->set_axis(axis); + joym->set_axis_value(direction); + String desc = get_event_text(joym); + + if (!search_term.is_empty() && desc.findn(search_term) == -1) { + continue; + } + + TreeItem *item = input_list_tree->create_item(joya_root); + item->set_text(0, desc); + item->set_meta("__axis", i >> 1); + item->set_meta("__value", (i & 1) ? 1 : -1); + } + } +} + +void InputEventConfigurationDialog::_mod_toggled(bool p_checked, int p_index) { + Ref<InputEventWithModifiers> ie = event; + + // Not event with modifiers + if (ie.is_null()) { + return; + } + + if (p_index == 0) { + ie->set_alt(p_checked); + } else if (p_index == 1) { + ie->set_shift(p_checked); + } else if (p_index == 2) { + ie->set_command(p_checked); + } else if (p_index == 3) { + ie->set_control(p_checked); + } else if (p_index == 4) { + ie->set_metakey(p_checked); + } + + _set_event(ie); +} + +void InputEventConfigurationDialog::_store_command_toggled(bool p_checked) { + Ref<InputEventWithModifiers> ie = event; + if (ie.is_valid()) { + ie->set_store_command(p_checked); + _set_event(ie); + } + + if (p_checked) { + // If storing Command, show it's checkbox and hide Control (Win/Lin) or Meta (Mac) +#ifdef APPLE_STYLE_KEYS + mod_checkboxes[MOD_META]->hide(); + + mod_checkboxes[MOD_COMMAND]->show(); + mod_checkboxes[MOD_COMMAND]->set_text("Meta (Command)"); +#else + mod_checkboxes[MOD_CONTROL]->hide(); + + mod_checkboxes[MOD_COMMAND]->show(); + mod_checkboxes[MOD_COMMAND]->set_text("Control (Command)"); +#endif + } else { + // If not, hide Command, show Control and Meta. + mod_checkboxes[MOD_COMMAND]->hide(); + mod_checkboxes[MOD_CONTROL]->show(); + mod_checkboxes[MOD_META]->show(); + } +} + +void InputEventConfigurationDialog::_physical_keycode_toggled(bool p_checked) { + Ref<InputEventKey> k = event; + + if (k.is_null()) { + return; + } + + if (p_checked) { + k->set_physical_keycode(k->get_keycode()); + k->set_keycode(0); + } else { + k->set_keycode(k->get_physical_keycode()); + k->set_physical_keycode(0); + } + + _set_event(k); +} + +void InputEventConfigurationDialog::_input_list_item_selected() { + TreeItem *selected = input_list_tree->get_selected(); + + // Invalid tree selection - type only exists on the "category" items, which are not a valid selection. + if (selected->has_meta("__type")) { + return; + } + + int input_type = selected->get_parent()->get_meta("__type"); + + switch (input_type) { + case InputEventConfigurationDialog::INPUT_KEY: { + int kc = selected->get_meta("__keycode"); + Ref<InputEventKey> k; + k.instance(); + + if (physical_key_checkbox->is_pressed()) { + k->set_physical_keycode(kc); + k->set_keycode(0); + } else { + k->set_physical_keycode(0); + k->set_keycode(kc); + } + + // Maintain modifier state from checkboxes + k->set_alt(mod_checkboxes[MOD_ALT]->is_pressed()); + k->set_shift(mod_checkboxes[MOD_SHIFT]->is_pressed()); + k->set_command(mod_checkboxes[MOD_COMMAND]->is_pressed()); + k->set_control(mod_checkboxes[MOD_CONTROL]->is_pressed()); + k->set_metakey(mod_checkboxes[MOD_META]->is_pressed()); + k->set_store_command(store_command_checkbox->is_pressed()); + + _set_event(k); + } break; + case InputEventConfigurationDialog::INPUT_MOUSE_BUTTON: { + int idx = selected->get_meta("__index"); + Ref<InputEventMouseButton> mb; + mb.instance(); + mb->set_button_index(idx); + // Maintain modifier state from checkboxes + mb->set_alt(mod_checkboxes[MOD_ALT]->is_pressed()); + mb->set_shift(mod_checkboxes[MOD_SHIFT]->is_pressed()); + mb->set_command(mod_checkboxes[MOD_COMMAND]->is_pressed()); + mb->set_control(mod_checkboxes[MOD_CONTROL]->is_pressed()); + mb->set_metakey(mod_checkboxes[MOD_META]->is_pressed()); + mb->set_store_command(store_command_checkbox->is_pressed()); + + _set_event(mb); + } break; + case InputEventConfigurationDialog::INPUT_JOY_BUTTON: { + int idx = selected->get_meta("__index"); + Ref<InputEventJoypadButton> jb = InputEventJoypadButton::create_reference(idx); + _set_event(jb); + } break; + case InputEventConfigurationDialog::INPUT_JOY_MOTION: { + int axis = selected->get_meta("__axis"); + int value = selected->get_meta("__value"); + + Ref<InputEventJoypadMotion> jm; + jm.instance(); + jm->set_axis(axis); + jm->set_axis_value(value); + _set_event(jm); + } break; + default: + break; + } +} + +void InputEventConfigurationDialog::_set_current_device(int i_device) { + device_id_option->select(i_device + 1); +} + +int InputEventConfigurationDialog::_get_current_device() const { + return device_id_option->get_selected() - 1; +} + +String InputEventConfigurationDialog::_get_device_string(int i_device) const { + if (i_device == InputMap::ALL_DEVICES) { + return TTR("All Devices"); + } + return TTR("Device") + " " + itos(i_device); +} + +void InputEventConfigurationDialog::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + input_list_search->set_right_icon(input_list_search->get_theme_icon("Search", "EditorIcons")); + + physical_key_checkbox->set_icon(get_theme_icon("KeyboardPhysical", "EditorIcons")); + + icon_cache.keyboard = get_theme_icon("Keyboard", "EditorIcons"); + icon_cache.mouse = get_theme_icon("Mouse", "EditorIcons"); + icon_cache.joypad_button = get_theme_icon("JoyButton", "EditorIcons"); + icon_cache.joypad_axis = get_theme_icon("JoyAxis", "EditorIcons"); + + _update_input_list(); + } break; + default: + break; + } +} + +void InputEventConfigurationDialog::popup_and_configure(const Ref<InputEvent> &p_event) { + if (p_event.is_valid()) { + _set_event(p_event); + } else { + // Clear Event + _set_event(p_event); + + // Clear Checkbox Values + for (int i = 0; i < MOD_MAX; i++) { + mod_checkboxes[i]->set_pressed(false); + } + physical_key_checkbox->set_pressed(false); + store_command_checkbox->set_pressed(true); + _set_current_device(0); + + // Switch to "Listen" tab + tab_container->set_current_tab(0); + } + + popup_centered(); +} + +Ref<InputEvent> InputEventConfigurationDialog::get_event() const { + return event; +} + +void InputEventConfigurationDialog::set_allowed_input_types(int p_type_masks) { + allowed_input_types = p_type_masks; +} + +InputEventConfigurationDialog::InputEventConfigurationDialog() { + allowed_input_types = INPUT_KEY | INPUT_MOUSE_BUTTON | INPUT_JOY_BUTTON | INPUT_JOY_MOTION; + + set_title("Event Configuration"); + set_min_size(Size2i(550 * EDSCALE, 0)); // Min width + + VBoxContainer *main_vbox = memnew(VBoxContainer); + add_child(main_vbox); + + tab_container = memnew(TabContainer); + tab_container->set_tab_align(TabContainer::TabAlign::ALIGN_LEFT); + tab_container->set_use_hidden_tabs_for_min_size(true); + tab_container->set_v_size_flags(Control::SIZE_EXPAND_FILL); + tab_container->connect("tab_selected", callable_mp(this, &InputEventConfigurationDialog::_tab_selected)); + main_vbox->add_child(tab_container); + + CenterContainer *cc = memnew(CenterContainer); + cc->set_name("Listen for Input"); + event_as_text = memnew(Label); + event_as_text->set_align(Label::ALIGN_CENTER); + cc->add_child(event_as_text); + tab_container->add_child(cc); + + // List of all input options to manually select from. + + VBoxContainer *manual_vbox = memnew(VBoxContainer); + manual_vbox->set_name("Manual Selection"); + manual_vbox->set_v_size_flags(Control::SIZE_EXPAND_FILL); + tab_container->add_child(manual_vbox); + + input_list_search = memnew(LineEdit); + input_list_search->set_h_size_flags(Control::SIZE_EXPAND_FILL); + input_list_search->set_placeholder(TTR("Filter Inputs")); + input_list_search->set_clear_button_enabled(true); + input_list_search->connect("text_changed", callable_mp(this, &InputEventConfigurationDialog::_search_term_updated)); + manual_vbox->add_child(input_list_search); + + input_list_tree = memnew(Tree); + input_list_tree->set_custom_minimum_size(Size2(0, 100 * EDSCALE)); // Min height for tree + input_list_tree->connect("item_selected", callable_mp(this, &InputEventConfigurationDialog::_input_list_item_selected)); + input_list_tree->set_v_size_flags(Control::SIZE_EXPAND_FILL); + manual_vbox->add_child(input_list_tree); + + input_list_tree->set_hide_root(true); + input_list_tree->set_columns(1); + + _update_input_list(); + + // Additional Options + additional_options_container = memnew(VBoxContainer); + additional_options_container->hide(); + + Label *opts_label = memnew(Label); + opts_label->set_text("Additional Options"); + additional_options_container->add_child(opts_label); + + // Device Selection + device_container = memnew(HBoxContainer); + device_container->set_h_size_flags(Control::SIZE_EXPAND_FILL); + + Label *device_label = memnew(Label); + device_label->set_text("Device:"); + device_container->add_child(device_label); + + device_id_option = memnew(OptionButton); + device_id_option->set_h_size_flags(Control::SIZE_EXPAND_FILL); + device_container->add_child(device_id_option); + + for (int i = -1; i < 8; i++) { + device_id_option->add_item(_get_device_string(i)); + } + _set_current_device(0); + device_container->hide(); + additional_options_container->add_child(device_container); + + // Modifier Selection + mod_container = memnew(HBoxContainer); + for (int i = 0; i < MOD_MAX; i++) { + String name = mods[i]; + mod_checkboxes[i] = memnew(CheckBox); + mod_checkboxes[i]->connect("toggled", callable_mp(this, &InputEventConfigurationDialog::_mod_toggled), varray(i)); + mod_checkboxes[i]->set_text(name); + mod_container->add_child(mod_checkboxes[i]); + } + + mod_container->add_child(memnew(VSeparator)); + + store_command_checkbox = memnew(CheckBox); + store_command_checkbox->connect("toggled", callable_mp(this, &InputEventConfigurationDialog::_store_command_toggled)); + store_command_checkbox->set_pressed(true); + store_command_checkbox->set_text(TTR("Store Command")); +#ifdef APPLE_STYLE_KEYS + store_command_checkbox->set_tooltip(TTR("Toggles between serializing 'command' and 'meta'. Used for compatibility with Windows/Linux style keyboard.")); +#else + store_command_checkbox->set_tooltip(TTR("Toggles between serializing 'command' and 'control'. Used for compatibility with Apple Style keyboards.")); +#endif + mod_container->add_child(store_command_checkbox); + + mod_container->hide(); + additional_options_container->add_child(mod_container); + + // Physical Key Checkbox + + physical_key_checkbox = memnew(CheckBox); + physical_key_checkbox->set_text(TTR("Use Physical Keycode")); + physical_key_checkbox->set_tooltip(TTR("Stores the physical position of the key on the keyboard rather than the keys value. Used for compatibility with non-latin layouts.")); + physical_key_checkbox->connect("toggled", callable_mp(this, &InputEventConfigurationDialog::_physical_keycode_toggled)); + physical_key_checkbox->hide(); + additional_options_container->add_child(physical_key_checkbox); + + main_vbox->add_child(additional_options_container); + + // Default to first tab + tab_container->set_current_tab(0); +} + +///////////////////////////////////////// + +static bool _is_action_name_valid(const String &p_name) { + const char32_t *cstr = p_name.get_data(); + for (int i = 0; cstr[i]; i++) { + if (cstr[i] == '/' || cstr[i] == ':' || cstr[i] == '"' || + cstr[i] == '=' || cstr[i] == '\\' || cstr[i] < 32) { + return false; + } + } + return true; +} + +void ActionMapEditor::_event_config_confirmed() { + Ref<InputEvent> ev = event_config_dialog->get_event(); + + Dictionary new_action = current_action.duplicate(); + Array events = new_action["events"]; + + if (current_action_event_index == -1) { + // Add new event + events.push_back(ev); + } else { + // Edit existing event + events[current_action_event_index] = ev; + } + + new_action["events"] = events; + emit_signal("action_edited", current_action_name, new_action); +} + +void ActionMapEditor::_add_action_pressed() { + _add_action(add_edit->get_text()); +} + +void ActionMapEditor::_add_action(const String &p_name) { + if (!allow_editing_actions) { + return; + } + + if (p_name == "" || !_is_action_name_valid(p_name)) { + show_message(TTR("Invalid action name. it cannot be.is_empty()() nor contain '/', ':', '=', '\\' or '\"'")); + return; + } + + add_edit->clear(); + emit_signal("action_added", p_name); +} + +void ActionMapEditor::_action_edited() { + if (!allow_editing_actions) { + return; + } + + TreeItem *ti = action_tree->get_edited(); + if (!ti) { + return; + } + + if (action_tree->get_selected_column() == 0) { + // Name Edited + String new_name = ti->get_text(0); + String old_name = ti->get_meta("__name"); + + if (new_name == old_name) { + return; + } + + if (new_name == "" || !_is_action_name_valid(new_name)) { + ti->set_text(0, old_name); + show_message(TTR("Invalid action name. it cannot be.is_empty()() nor contain '/', ':', '=', '\\' or '\"'")); + return; + } + + emit_signal("action_renamed", old_name, new_name); + } else if (action_tree->get_selected_column() == 1) { + // Deadzone Edited + String name = ti->get_meta("__name"); + Dictionary old_action = ti->get_meta("__action"); + Dictionary new_action = old_action.duplicate(); + new_action["deadzone"] = ti->get_range(1); + + // Call deferred so that input can finish propagating through tree, allowing re-making of tree to occur. + call_deferred("emit_signal", "action_edited", name, new_action); + } +} + +void ActionMapEditor::_tree_button_pressed(Object *p_item, int p_column, int p_id) { + ItemButton option = (ItemButton)p_id; + + TreeItem *item = Object::cast_to<TreeItem>(p_item); + if (!item) { + return; + } + + switch (option) { + case ActionMapEditor::BUTTON_ADD_EVENT: { + current_action = item->get_meta("__action"); + current_action_name = item->get_meta("__name"); + current_action_event_index = -1; + + event_config_dialog->popup_and_configure(); + + } break; + case ActionMapEditor::BUTTON_EDIT_EVENT: { + // Action and Action name is located on the parent of the event. + current_action = item->get_parent()->get_meta("__action"); + current_action_name = item->get_parent()->get_meta("__name"); + + current_action_event_index = item->get_meta("__index"); + + Ref<InputEvent> ie = item->get_meta("__event"); + if (ie.is_valid()) { + event_config_dialog->popup_and_configure(ie); + } + + } break; + case ActionMapEditor::BUTTON_REMOVE_ACTION: { + if (!allow_editing_actions) { + break; + } + + // Send removed action name + String name = item->get_meta("__name"); + emit_signal("action_removed", name); + } break; + case ActionMapEditor::BUTTON_REMOVE_EVENT: { + // Remove event and send updated action + Dictionary action = item->get_parent()->get_meta("__action"); + String action_name = item->get_parent()->get_meta("__name"); + + int event_index = item->get_meta("__index"); + + Array events = action["events"]; + events.remove(event_index); + action["events"] = events; + + emit_signal("action_edited", action_name, action); + } break; + default: + break; + } +} + +void ActionMapEditor::_tree_item_activated() { + TreeItem *item = action_tree->get_selected(); + + if (!item || !item->has_meta("__event")) { + return; + } + + _tree_button_pressed(item, 2, BUTTON_EDIT_EVENT); +} + +void ActionMapEditor::set_show_uneditable(bool p_show) { + show_uneditable = p_show; + show_uneditable_actions_checkbox->set_pressed(p_show); + + // Prevent unnecessary updates of action list when cache is.is_empty()(). + if (!actions_cache.is_empty()) { + update_action_list(); + } +} + +void ActionMapEditor::_search_term_updated(const String &) { + update_action_list(); +} + +Variant ActionMapEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) { + TreeItem *selected = action_tree->get_selected(); + if (!selected) { + return Variant(); + } + + String name = selected->get_text(0); + Label *label = memnew(Label(name)); + label->set_modulate(Color(1, 1, 1, 1.0f)); + action_tree->set_drag_preview(label); + + Dictionary drag_data; + + if (selected->has_meta("__action")) { + drag_data["input_type"] = "action"; + } + + if (selected->has_meta("__event")) { + drag_data["input_type"] = "event"; + } + + action_tree->set_drop_mode_flags(Tree::DROP_MODE_INBETWEEN); + + return drag_data; +} + +bool ActionMapEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const { + Dictionary d = p_data; + if (!d.has("input_type")) { + return false; + } + + TreeItem *selected = action_tree->get_selected(); + TreeItem *item = action_tree->get_item_at_position(p_point); + if (!selected || !item || item == selected) { + return false; + } + + // Don't allow moving an action in-between events. + if (d["input_type"] == "action" && item->has_meta("__event")) { + return false; + } + + // Don't allow moving an event to a different action. + if (d["input_type"] == "event" && item->get_parent() != selected->get_parent()) { + return false; + } + + return true; +} + +void ActionMapEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) { + if (!can_drop_data_fw(p_point, p_data, p_from)) { + return; + } + + TreeItem *selected = action_tree->get_selected(); + TreeItem *target = action_tree->get_item_at_position(p_point); + bool drop_above = action_tree->get_drop_section_at_position(p_point) == -1; + + if (!target) { + return; + } + + Dictionary d = p_data; + if (d["input_type"] == "action") { + // Change action order. + String relative_to = target->get_meta("__name"); + String action_name = selected->get_meta("__name"); + emit_signal("action_reordered", action_name, relative_to, drop_above); + + } else if (d["input_type"] == "event") { + // Change event order + int current_index = selected->get_meta("__index"); + int target_index = target->get_meta("__index"); + + // Construct new events array. + Dictionary new_action = selected->get_parent()->get_meta("__action"); + + Array events = new_action["events"]; + Array new_events; + + // The following method was used to perform the array changes since `remove` followed by `insert` was not working properly at time of writing. + // Loop thought existing events + for (int i = 0; i < events.size(); i++) { + // If you come across the current index, just skip it, as it has been moved. + if (i == current_index) { + continue; + } else if (i == target_index) { + // We are at the target index. If drop above, add selected event there first, then target, so moved event goes on top. + if (drop_above) { + new_events.push_back(events[current_index]); + new_events.push_back(events[target_index]); + } else { + new_events.push_back(events[target_index]); + new_events.push_back(events[current_index]); + } + } else { + new_events.push_back(events[i]); + } + } + + new_action["events"] = new_events; + emit_signal("action_edited", selected->get_parent()->get_meta("__name"), new_action); + } +} + +void ActionMapEditor::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + action_list_search->set_right_icon(get_theme_icon("Search", "EditorIcons")); + } break; + default: + break; + } +} + +void ActionMapEditor::_bind_methods() { + ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &ActionMapEditor::get_drag_data_fw); + ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &ActionMapEditor::can_drop_data_fw); + ClassDB::bind_method(D_METHOD("drop_data_fw"), &ActionMapEditor::drop_data_fw); + + ADD_SIGNAL(MethodInfo("action_added", PropertyInfo(Variant::STRING, "name"))); + ADD_SIGNAL(MethodInfo("action_edited", PropertyInfo(Variant::STRING, "name"), PropertyInfo(Variant::DICTIONARY, "new_action"))); + ADD_SIGNAL(MethodInfo("action_removed", PropertyInfo(Variant::STRING, "name"))); + ADD_SIGNAL(MethodInfo("action_renamed", PropertyInfo(Variant::STRING, "old_name"), PropertyInfo(Variant::STRING, "new_name"))); + ADD_SIGNAL(MethodInfo("action_reordered", PropertyInfo(Variant::STRING, "action_name"), PropertyInfo(Variant::STRING, "relative_to"), PropertyInfo(Variant::BOOL, "before"))); +} + +LineEdit *ActionMapEditor::get_search_box() const { + return action_list_search; +} + +InputEventConfigurationDialog *ActionMapEditor::get_configuration_dialog() { + return event_config_dialog; +} + +void ActionMapEditor::update_action_list(const Vector<ActionInfo> &p_action_infos) { + if (!p_action_infos.is_empty()) { + actions_cache = p_action_infos; + } + + action_tree->clear(); + TreeItem *root = action_tree->create_item(); + + int uneditable_count = 0; + + for (int i = 0; i < actions_cache.size(); i++) { + ActionInfo action_info = actions_cache[i]; + + if (!action_info.editable) { + uneditable_count++; + } + + String search_term = action_list_search->get_text(); + if (!search_term.is_empty() && action_info.name.findn(search_term) == -1) { + continue; + } + + if (!action_info.editable && !show_uneditable) { + continue; + } + + const Array events = action_info.action["events"]; + const Variant deadzone = action_info.action["deadzone"]; + + // Update Tree... + + TreeItem *action_item = action_tree->create_item(root); + action_item->set_meta("__action", action_info.action); + action_item->set_meta("__name", action_info.name); + + // First Column - Action Name + action_item->set_text(0, action_info.name); + action_item->set_editable(0, action_info.editable); + action_item->set_icon(0, action_info.icon); + + // Second Column - Deadzone + action_item->set_editable(1, true); + action_item->set_cell_mode(1, TreeItem::CELL_MODE_RANGE); + action_item->set_range_config(1, 0.0, 1.0, 0.01); + action_item->set_range(1, deadzone); + + // Third column - buttons + action_item->add_button(2, action_tree->get_theme_icon("Add", "EditorIcons"), BUTTON_ADD_EVENT, false, TTR("Add Event")); + action_item->add_button(2, action_tree->get_theme_icon("Remove", "EditorIcons"), BUTTON_REMOVE_ACTION, !action_info.editable, action_info.editable ? "Remove Action" : "Cannot Remove Action"); + + action_item->set_custom_bg_color(0, action_tree->get_theme_color("prop_subsection", "Editor")); + action_item->set_custom_bg_color(1, action_tree->get_theme_color("prop_subsection", "Editor")); + + for (int evnt_idx = 0; evnt_idx < events.size(); evnt_idx++) { + Ref<InputEvent> event = events[evnt_idx]; + if (event.is_null()) { + continue; + } + + TreeItem *event_item = action_tree->create_item(action_item); + + // First Column - Text + event_item->set_text(0, event_config_dialog->get_event_text(event)); // Need to us the special description for JoypadMotion here, so don't use as_text() directly. + event_item->set_meta("__event", event); + event_item->set_meta("__index", evnt_idx); + + // Third Column - Buttons + event_item->add_button(2, action_tree->get_theme_icon("Edit", "EditorIcons"), BUTTON_EDIT_EVENT, false, TTR("Edit Event")); + event_item->add_button(2, action_tree->get_theme_icon("Remove", "EditorIcons"), BUTTON_REMOVE_EVENT, false, TTR("Remove Event")); + event_item->set_button_color(2, 0, Color(1, 1, 1, 0.75)); + event_item->set_button_color(2, 1, Color(1, 1, 1, 0.75)); + } + } +} + +void ActionMapEditor::show_message(const String &p_message) { + message->set_text(p_message); + message->popup_centered(Size2(300, 100) * EDSCALE); +} + +void ActionMapEditor::set_allow_editing_actions(bool p_allow) { + allow_editing_actions = p_allow; + add_hbox->set_visible(p_allow); +} + +void ActionMapEditor::set_toggle_editable_label(const String &p_label) { + show_uneditable_actions_checkbox->set_text(p_label); +} + +void ActionMapEditor::use_external_search_box(LineEdit *p_searchbox) { + memdelete(action_list_search); + action_list_search = p_searchbox; + action_list_search->connect("text_changed", callable_mp(this, &ActionMapEditor::_search_term_updated)); +} + +ActionMapEditor::ActionMapEditor() { + allow_editing_actions = true; + show_uneditable = true; + + // Main Vbox Container + VBoxContainer *main_vbox = memnew(VBoxContainer); + main_vbox->set_anchors_and_offsets_preset(PRESET_WIDE); + add_child(main_vbox); + + HBoxContainer *top_hbox = memnew(HBoxContainer); + main_vbox->add_child(top_hbox); + + action_list_search = memnew(LineEdit); + action_list_search->set_h_size_flags(Control::SIZE_EXPAND_FILL); + action_list_search->set_placeholder(TTR("Filter Actions")); + action_list_search->set_clear_button_enabled(true); + action_list_search->connect("text_changed", callable_mp(this, &ActionMapEditor::_search_term_updated)); + top_hbox->add_child(action_list_search); + + show_uneditable_actions_checkbox = memnew(CheckBox); + show_uneditable_actions_checkbox->set_pressed(false); + show_uneditable_actions_checkbox->set_text(TTR("Show Uneditable Actions")); + show_uneditable_actions_checkbox->connect("toggled", callable_mp(this, &ActionMapEditor::set_show_uneditable)); + top_hbox->add_child(show_uneditable_actions_checkbox); + + // Adding Action line edit + button + add_hbox = memnew(HBoxContainer); + add_hbox->set_h_size_flags(Control::SIZE_EXPAND_FILL); + + add_edit = memnew(LineEdit); + add_edit->set_h_size_flags(Control::SIZE_EXPAND_FILL); + add_edit->set_placeholder(TTR("Add New Action")); + add_edit->set_clear_button_enabled(true); + add_edit->connect("text_entered", callable_mp(this, &ActionMapEditor::_add_action)); + add_hbox->add_child(add_edit); + + Button *add_button = memnew(Button); + add_button->set_text("Add"); + add_button->connect("pressed", callable_mp(this, &ActionMapEditor::_add_action_pressed)); + add_hbox->add_child(add_button); + + main_vbox->add_child(add_hbox); + + // Action Editor Tree + action_tree = memnew(Tree); + action_tree->set_v_size_flags(Control::SIZE_EXPAND_FILL); + action_tree->set_columns(3); + action_tree->set_hide_root(true); + action_tree->set_column_titles_visible(true); + action_tree->set_column_title(0, TTR("Action")); + action_tree->set_column_title(1, TTR("Deadzone")); + action_tree->set_column_expand(1, false); + action_tree->set_column_min_width(1, 80 * EDSCALE); + action_tree->set_column_expand(2, false); + action_tree->set_column_min_width(2, 50 * EDSCALE); + action_tree->connect("item_edited", callable_mp(this, &ActionMapEditor::_action_edited)); + action_tree->connect("item_activated", callable_mp(this, &ActionMapEditor::_tree_item_activated)); + action_tree->connect("button_pressed", callable_mp(this, &ActionMapEditor::_tree_button_pressed)); + main_vbox->add_child(action_tree); + + action_tree->set_drag_forwarding(this); + + // Adding event dialog + event_config_dialog = memnew(InputEventConfigurationDialog); + event_config_dialog->connect("confirmed", callable_mp(this, &ActionMapEditor::_event_config_confirmed)); + add_child(event_config_dialog); + + message = memnew(AcceptDialog); + add_child(message); +} diff --git a/editor/action_map_editor.h b/editor/action_map_editor.h new file mode 100644 index 0000000000..f1f7bffef4 --- /dev/null +++ b/editor/action_map_editor.h @@ -0,0 +1,203 @@ +/*************************************************************************/ +/* action_map_editor.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2021 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 ACTION_MAP_EDITOR_H +#define ACTION_MAP_EDITOR_H + +#include "editor/editor_data.h" + +// Confirmation Dialog used when configuring an input event. +// Separate from ActionMapEditor for code cleanliness and separation of responsibilities. +class InputEventConfigurationDialog : public ConfirmationDialog { + GDCLASS(InputEventConfigurationDialog, ConfirmationDialog); + +public: + enum InputType { + INPUT_KEY = 1, + INPUT_MOUSE_BUTTON = 2, + INPUT_JOY_BUTTON = 4, + INPUT_JOY_MOTION = 8 + }; + +private: + struct IconCache { + Ref<Texture2D> keyboard; + Ref<Texture2D> mouse; + Ref<Texture2D> joypad_button; + Ref<Texture2D> joypad_axis; + } icon_cache; + + Ref<InputEvent> event = Ref<InputEvent>(); + + TabContainer *tab_container; + + // Listening for input + Label *event_as_text; + + // List of All Key/Mouse/Joypad input options. + int allowed_input_types; + Tree *input_list_tree; + LineEdit *input_list_search; + + // Additional Options, shown depending on event selected + VBoxContainer *additional_options_container; + + HBoxContainer *device_container; + OptionButton *device_id_option; + + HBoxContainer *mod_container; // Contains the subcontainer and the store command checkbox. + + enum ModCheckbox { + MOD_ALT, + MOD_SHIFT, + MOD_COMMAND, + MOD_CONTROL, + MOD_META, + MOD_MAX + }; + String mods[MOD_MAX] = { "Alt", "Shift", "Command", "Control", "Meta" }; + + CheckBox *mod_checkboxes[MOD_MAX]; + CheckBox *store_command_checkbox; + + CheckBox *physical_key_checkbox; + + void _set_event(const Ref<InputEvent> &p_event); + + void _tab_selected(int p_tab); + void _listen_window_input(const Ref<InputEvent> &p_event); + + void _search_term_updated(const String &p_term); + void _update_input_list(); + void _input_list_item_selected(); + + void _mod_toggled(bool p_checked, int p_index); + void _store_command_toggled(bool p_checked); + void _physical_keycode_toggled(bool p_checked); + + void _set_current_device(int i_device); + int _get_current_device() const; + String _get_device_string(int i_device) const; + +protected: + void _notification(int p_what); + +public: + // Pass an existing event to configure it. Alternatively, pass no event to start with a blank configuration. + void popup_and_configure(const Ref<InputEvent> &p_event = Ref<InputEvent>()); + Ref<InputEvent> get_event() const; + String get_event_text(const Ref<InputEvent> &p_event); + + void set_allowed_input_types(int p_type_masks); + + InputEventConfigurationDialog(); +}; + +class ActionMapEditor : public Control { + GDCLASS(ActionMapEditor, Control); + +public: + struct ActionInfo { + String name = String(); + Dictionary action = Dictionary(); + + Ref<Texture2D> icon = Ref<Texture2D>(); + bool editable = true; + }; + +private: + enum ItemButton { + BUTTON_ADD_EVENT, + BUTTON_EDIT_EVENT, + BUTTON_REMOVE_ACTION, + BUTTON_REMOVE_EVENT, + }; + + Vector<ActionInfo> actions_cache; + Tree *action_tree; + + // Storing which action/event is currently being edited in the InputEventConfigurationDialog. + + Dictionary current_action = Dictionary(); + String current_action_name = String(); + int current_action_event_index = -1; + + // Popups + + InputEventConfigurationDialog *event_config_dialog; + AcceptDialog *message; + + // Filtering and Adding actions + + bool show_uneditable; + CheckBox *show_uneditable_actions_checkbox; + LineEdit *action_list_search; + + bool allow_editing_actions; + HBoxContainer *add_hbox; + LineEdit *add_edit; + + void _event_config_confirmed(); + + void _add_action_pressed(); + void _add_action(const String &p_name); + void _action_edited(); + + void _tree_button_pressed(Object *p_item, int p_column, int p_id); + void _tree_item_activated(); + void _search_term_updated(const String &p_search_term); + + Variant get_drag_data_fw(const Point2 &p_point, Control *p_from); + bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; + void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); + +protected: + void _notification(int p_what); + static void _bind_methods(); + +public: + LineEdit *get_search_box() const; + InputEventConfigurationDialog *get_configuration_dialog(); + + // Dictionary represents an Action with "events" (Array) and "deadzone" (float) items. Pass with no param to update list from cached action map. + void update_action_list(const Vector<ActionInfo> &p_action_infos = Vector<ActionInfo>()); + void show_message(const String &p_message); + + void set_show_uneditable(bool p_show); + void set_allow_editing_actions(bool p_allow); + + void set_toggle_editable_label(const String &p_label); + + void use_external_search_box(LineEdit *p_searchbox); + + ActionMapEditor(); +}; + +#endif diff --git a/editor/animation_bezier_editor.cpp b/editor/animation_bezier_editor.cpp index 5d2b825c4f..92b4683018 100644 --- a/editor/animation_bezier_editor.cpp +++ b/editor/animation_bezier_editor.cpp @@ -615,7 +615,7 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { } Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_WHEEL_DOWN) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { float v_zoom_orig = v_zoom; if (mb->get_command()) { timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() * 1.05); @@ -628,7 +628,7 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { update(); } - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_WHEEL_UP) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { float v_zoom_orig = v_zoom; if (mb->get_command()) { timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() / 1.05); @@ -641,7 +641,7 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { update(); } - if (mb.is_valid() && mb->get_button_index() == BUTTON_MIDDLE) { + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_MIDDLE) { if (mb->is_pressed()) { int x = mb->get_position().x - timeline->get_name_limit(); panning_timeline_from = x / timeline->get_zoom_scale(); @@ -652,7 +652,7 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { } } - if (mb.is_valid() && mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) { + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) { menu_insert_key = mb->get_position(); if (menu_insert_key.x >= timeline->get_name_limit() && menu_insert_key.x <= get_size().width - timeline->get_buttons_width()) { Vector2 popup_pos = get_global_transform().xform(mb->get_position()); @@ -672,7 +672,7 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { } } - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (close_icon_rect.has_point(mb->get_position())) { emit_signal("close_request"); return; @@ -789,7 +789,7 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { } } - if (box_selecting_attempt && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (box_selecting_attempt && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (box_selecting) { //do actual select if (!box_selecting_add) { @@ -819,7 +819,7 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { update(); } - if (moving_handle != 0 && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (moving_handle != 0 && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { undo_redo->create_action(TTR("Move Bezier Points")); undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_in_handle", track, moving_handle_key, moving_handle_left); undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_out_handle", track, moving_handle_key, moving_handle_right); @@ -831,7 +831,7 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { update(); } - if (moving_selection_attempt && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (moving_selection_attempt && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (moving_selection) { //combit it @@ -927,7 +927,7 @@ void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { } Ref<InputEventMouseMotion> mm = p_event; - if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_MIDDLE) { + if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE) { v_scroll += mm->get_relative().y * v_zoom; if (v_scroll > 100000) { v_scroll = 100000; diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index 5d49290612..4274fb993f 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -634,7 +634,7 @@ public: bool use_fps = false; void notify_change() { - _change_notify(); + notify_property_list_changed(); } Node *get_root_path() { @@ -643,7 +643,7 @@ public: void set_use_fps(bool p_enable) { use_fps = p_enable; - _change_notify(); + notify_property_list_changed(); } }; @@ -1276,7 +1276,7 @@ public: UndoRedo *undo_redo = nullptr; void notify_change() { - _change_notify(); + notify_property_list_changed(); } Node *get_root_path() { @@ -1285,7 +1285,7 @@ public: void set_use_fps(bool p_enable) { use_fps = p_enable; - _change_notify(); + notify_property_list_changed(); } }; @@ -1643,24 +1643,24 @@ void AnimationTimelineEdit::_play_position_draw() { void AnimationTimelineEdit::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && hsize_rect.has_point(mb->get_position())) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && hsize_rect.has_point(mb->get_position())) { dragging_hsize = true; dragging_hsize_from = mb->get_position().x; dragging_hsize_at = name_limit; } - if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && dragging_hsize) { + if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && dragging_hsize) { dragging_hsize = false; } if (mb.is_valid() && mb->get_position().x > get_name_limit() && mb->get_position().x < (get_size().width - get_buttons_width())) { - if (!panning_timeline && mb->get_button_index() == BUTTON_LEFT) { + if (!panning_timeline && mb->get_button_index() == MOUSE_BUTTON_LEFT) { int x = mb->get_position().x - get_name_limit(); float ofs = x / get_zoom_scale() + get_value(); emit_signal("timeline_changed", ofs, false); dragging_timeline = true; } - if (!dragging_timeline && mb->get_button_index() == BUTTON_MIDDLE) { + if (!dragging_timeline && mb->get_button_index() == MOUSE_BUTTON_MIDDLE) { int x = mb->get_position().x - get_name_limit(); panning_timeline_from = x / get_zoom_scale(); panning_timeline = true; @@ -1668,11 +1668,11 @@ void AnimationTimelineEdit::_gui_input(const Ref<InputEvent> &p_event) { } } - if (dragging_timeline && mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && !mb->is_pressed()) { + if (dragging_timeline && mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT && !mb->is_pressed()) { dragging_timeline = false; } - if (panning_timeline && mb.is_valid() && mb->get_button_index() == BUTTON_MIDDLE && !mb->is_pressed()) { + if (panning_timeline && mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_MIDDLE && !mb->is_pressed()) { panning_timeline = false; } @@ -2540,7 +2540,7 @@ void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { } Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { Point2 pos = mb->get_position(); if (check_rect.has_point(pos)) { @@ -2683,7 +2683,7 @@ void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { } } - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { Point2 pos = mb->get_position(); if (pos.x >= timeline->get_name_limit() && pos.x <= get_size().width - timeline->get_buttons_width()) { // Can do something with menu too! show insert key. @@ -2713,7 +2713,7 @@ void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { } } - if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && clicking_on_name) { + if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && clicking_on_name) { if (!path) { path_popup = memnew(Popup); path_popup->set_wrap_controls(true); @@ -2735,7 +2735,7 @@ void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { } if (mb.is_valid() && moving_selection_attempt) { - if (!mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (!mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { moving_selection_attempt = false; if (moving_selection) { emit_signal("move_selection_commit"); @@ -2746,7 +2746,7 @@ void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { select_single_attempt = -1; } - if (moving_selection && mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) { + if (moving_selection && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { moving_selection_attempt = false; moving_selection = false; emit_signal("move_selection_cancel"); @@ -2754,7 +2754,7 @@ void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) { } Ref<InputEventMouseMotion> mm = p_event; - if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT && moving_selection_attempt) { + if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT && moving_selection_attempt) { if (!moving_selection) { moving_selection = true; emit_signal("move_selection_begin"); @@ -4283,7 +4283,6 @@ void AnimationTrackEditor::_animation_update() { _update_step_spinbox(); emit_signal("animation_step_changed", animation->get_step()); emit_signal("animation_len_changed", animation->get_length()); - EditorNode::get_singleton()->get_inspector()->refresh(); animation_changing_awaiting_update = false; } @@ -4440,6 +4439,8 @@ void AnimationTrackEditor::_add_track(int p_type) { } adding_track_type = p_type; pick_track->popup_scenetree_dialog(); + pick_track->get_filter_line_edit()->clear(); + pick_track->get_filter_line_edit()->grab_focus(); } void AnimationTrackEditor::_new_track_property_selected(String p_name) { @@ -4954,17 +4955,17 @@ void AnimationTrackEditor::_box_selection_draw() { void AnimationTrackEditor::_scroll_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_command() && mb->get_button_index() == BUTTON_WHEEL_UP) { + if (mb.is_valid() && mb->is_pressed() && mb->get_command() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() * 1.05); scroll->accept_event(); } - if (mb.is_valid() && mb->is_pressed() && mb->get_command() && mb->get_button_index() == BUTTON_WHEEL_DOWN) { + if (mb.is_valid() && mb->is_pressed() && mb->get_command() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() / 1.05); scroll->accept_event(); } - if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->is_pressed()) { box_selecting = true; box_selecting_from = scroll->get_global_transform().xform(mb->get_position()); @@ -4992,12 +4993,12 @@ void AnimationTrackEditor::_scroll_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseMotion> mm = p_event; - if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_MIDDLE) { + if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE) { timeline->set_value(timeline->get_value() - mm->get_relative().x / timeline->get_zoom_scale()); } if (mm.is_valid() && box_selecting) { - if (!(mm->get_button_mask() & BUTTON_MASK_LEFT)) { + if (!(mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT)) { //no longer box_selection->hide(); box_selecting = false; @@ -5636,6 +5637,70 @@ void AnimationTrackEditor::_bind_methods() { ADD_SIGNAL(MethodInfo("animation_step_changed", PropertyInfo(Variant::FLOAT, "step"))); } +void AnimationTrackEditor::_pick_track_filter_text_changed(const String &p_newtext) { + TreeItem *root_item = pick_track->get_scene_tree()->get_scene_tree()->get_root(); + + Vector<Node *> select_candidates; + Node *to_select = nullptr; + + String filter = pick_track->get_filter_line_edit()->get_text(); + + _pick_track_select_recursive(root_item, filter, select_candidates); + + if (!select_candidates.is_empty()) { + for (int i = 0; i < select_candidates.size(); ++i) { + Node *candidate = select_candidates[i]; + + if (((String)candidate->get_name()).to_lower().begins_with(filter.to_lower())) { + to_select = candidate; + break; + } + } + + if (!to_select) { + to_select = select_candidates[0]; + } + } + + pick_track->get_scene_tree()->set_selected(to_select); +} + +void AnimationTrackEditor::_pick_track_select_recursive(TreeItem *p_item, const String &p_filter, Vector<Node *> &p_select_candidates) { + if (!p_item) { + return; + } + + NodePath np = p_item->get_metadata(0); + Node *node = get_node(np); + + if (p_filter != String() && ((String)node->get_name()).findn(p_filter) != -1) { + p_select_candidates.push_back(node); + } + + TreeItem *c = p_item->get_children(); + + while (c) { + _pick_track_select_recursive(c, p_filter, p_select_candidates); + c = c->get_next(); + } +} + +void AnimationTrackEditor::_pick_track_filter_input(const Ref<InputEvent> &p_ie) { + Ref<InputEventKey> k = p_ie; + + if (k.is_valid()) { + switch (k->get_keycode()) { + case KEY_UP: + case KEY_DOWN: + case KEY_PAGEUP: + case KEY_PAGEDOWN: { + pick_track->get_scene_tree()->get_scene_tree()->call("_gui_input", k); + pick_track->get_filter_line_edit()->accept_event(); + } break; + } + } +} + AnimationTrackEditor::AnimationTrackEditor() { root = nullptr; @@ -5806,8 +5871,12 @@ AnimationTrackEditor::AnimationTrackEditor() { pick_track = memnew(SceneTreeDialog); add_child(pick_track); + pick_track->register_text_enter(pick_track->get_filter_line_edit()); pick_track->set_title(TTR("Pick a node to animate:")); pick_track->connect("selected", callable_mp(this, &AnimationTrackEditor::_new_track_node_selected)); + pick_track->get_filter_line_edit()->connect("text_changed", callable_mp(this, &AnimationTrackEditor::_pick_track_filter_text_changed)); + pick_track->get_filter_line_edit()->connect("gui_input", callable_mp(this, &AnimationTrackEditor::_pick_track_filter_input)); + prop_selector = memnew(PropertySelector); add_child(prop_selector); prop_selector->connect("selected", callable_mp(this, &AnimationTrackEditor::_new_track_property_selected)); @@ -5886,7 +5955,7 @@ AnimationTrackEditor::AnimationTrackEditor() { optimize_max_angle->set_value(22); optimize_dialog->get_ok_button()->set_text(TTR("Optimize")); - optimize_dialog->connect("confirmed", callable_mp(this, &AnimationTrackEditor::_edit_menu_pressed), varray(EDIT_CLEAN_UP_ANIMATION_CONFIRM)); + optimize_dialog->connect("confirmed", callable_mp(this, &AnimationTrackEditor::_edit_menu_pressed), varray(EDIT_OPTIMIZE_ANIMATION_CONFIRM)); // diff --git a/editor/animation_track_editor.h b/editor/animation_track_editor.h index e8e4f915fa..c25865effb 100644 --- a/editor/animation_track_editor.h +++ b/editor/animation_track_editor.h @@ -499,6 +499,10 @@ class AnimationTrackEditor : public VBoxContainer { void _insert_animation_key(NodePath p_path, const Variant &p_value); + void _pick_track_filter_text_changed(const String &p_newtext); + void _pick_track_select_recursive(TreeItem *p_item, const String &p_filter, Vector<Node *> &p_select_candidates); + void _pick_track_filter_input(const Ref<InputEvent> &p_ie); + protected: static void _bind_methods(); void _notification(int p_what); diff --git a/editor/animation_track_editor_plugins.cpp b/editor/animation_track_editor_plugins.cpp index 0c0ee2856e..fa27dfb3e5 100644 --- a/editor/animation_track_editor_plugins.cpp +++ b/editor/animation_track_editor_plugins.cpp @@ -1076,7 +1076,7 @@ void AnimationTrackEditTypeAudio::_gui_input(const Ref<InputEvent> &p_event) { } Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && get_default_cursor_shape() == CURSOR_HSIZE) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && get_default_cursor_shape() == CURSOR_HSIZE) { len_resizing = true; len_resizing_start = mb->get_shift(); len_resizing_from_px = mb->get_position().x; @@ -1086,7 +1086,7 @@ void AnimationTrackEditTypeAudio::_gui_input(const Ref<InputEvent> &p_event) { return; } - if (len_resizing && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (len_resizing && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { float ofs_local = -len_resizing_rel / get_timeline()->get_zoom_scale(); if (len_resizing_start) { float prev_ofs = get_animation()->audio_track_get_key_start_offset(get_track(), len_resizing_index); diff --git a/editor/array_property_edit.cpp b/editor/array_property_edit.cpp index 3daee4587c..09defac354 100644 --- a/editor/array_property_edit.cpp +++ b/editor/array_property_edit.cpp @@ -49,11 +49,7 @@ Variant ArrayPropertyEdit::get_array() const { } void ArrayPropertyEdit::_notif_change() { - _change_notify(); -} - -void ArrayPropertyEdit::_notif_changev(const String &p_v) { - _change_notify(p_v.utf8().get_data()); + notify_property_list_changed(); } void ArrayPropertyEdit::_set_size(int p_size) { @@ -120,7 +116,7 @@ bool ArrayPropertyEdit::_set(const StringName &p_name, const Variant &p_value) { } if (pn == "array/page") { page = p_value; - _change_notify(); + notify_property_list_changed(); return true; } @@ -159,8 +155,6 @@ bool ArrayPropertyEdit::_set(const StringName &p_name, const Variant &p_value) { ur->create_action(TTR("Change Array Value")); ur->add_do_method(this, "_set_value", idx, p_value); ur->add_undo_method(this, "_set_value", idx, value); - ur->add_do_method(this, "_notif_changev", p_name); - ur->add_undo_method(this, "_notif_changev", p_name); ur->commit_action(); return true; } @@ -288,7 +282,6 @@ void ArrayPropertyEdit::_bind_methods() { ClassDB::bind_method(D_METHOD("_set_size"), &ArrayPropertyEdit::_set_size); ClassDB::bind_method(D_METHOD("_set_value"), &ArrayPropertyEdit::_set_value); ClassDB::bind_method(D_METHOD("_notif_change"), &ArrayPropertyEdit::_notif_change); - ClassDB::bind_method(D_METHOD("_notif_changev"), &ArrayPropertyEdit::_notif_changev); ClassDB::bind_method(D_METHOD("_dont_undo_redo"), &ArrayPropertyEdit::_dont_undo_redo); } diff --git a/editor/array_property_edit.h b/editor/array_property_edit.h index dd495b57f4..fa3dcbe038 100644 --- a/editor/array_property_edit.h +++ b/editor/array_property_edit.h @@ -47,7 +47,6 @@ class ArrayPropertyEdit : public Reference { Variant::Type default_type; void _notif_change(); - void _notif_changev(const String &p_v); void _set_size(int p_size); void _set_value(int p_idx, const Variant &p_value); diff --git a/editor/audio_stream_preview.cpp b/editor/audio_stream_preview.cpp index 8be8735f3e..539657afd7 100644 --- a/editor/audio_stream_preview.cpp +++ b/editor/audio_stream_preview.cpp @@ -155,7 +155,7 @@ void AudioStreamPreviewGenerator::_preview_thread(void *p_preview) { preview->playback->stop(); - preview->generating = false; + preview->generating.clear(); } Ref<AudioStreamPreview> AudioStreamPreviewGenerator::generate_preview(const Ref<AudioStream> &p_stream) { @@ -172,7 +172,7 @@ Ref<AudioStreamPreview> AudioStreamPreviewGenerator::generate_preview(const Ref< Preview *preview = &previews[p_stream->get_instance_id()]; preview->base_stream = p_stream; preview->playback = preview->base_stream->instance_playback(); - preview->generating = true; + preview->generating.set(); preview->id = p_stream->get_instance_id(); float len_s = preview->base_stream->get_length(); @@ -217,7 +217,7 @@ void AudioStreamPreviewGenerator::_notification(int p_what) { if (p_what == NOTIFICATION_PROCESS) { List<ObjectID> to_erase; for (Map<ObjectID, Preview>::Element *E = previews.front(); E; E = E->next()) { - if (!E->get().generating) { + if (!E->get().generating.is_set()) { if (E->get().thread) { E->get().thread->wait_to_finish(); memdelete(E->get().thread); diff --git a/editor/audio_stream_preview.h b/editor/audio_stream_preview.h index 21c9ea203e..accc7275c0 100644 --- a/editor/audio_stream_preview.h +++ b/editor/audio_stream_preview.h @@ -32,6 +32,7 @@ #define AUDIO_STREAM_PREVIEW_H #include "core/os/thread.h" +#include "core/templates/safe_refcount.h" #include "scene/main/node.h" #include "servers/audio/audio_stream.h" @@ -60,9 +61,20 @@ class AudioStreamPreviewGenerator : public Node { Ref<AudioStreamPreview> preview; Ref<AudioStream> base_stream; Ref<AudioStreamPlayback> playback; - volatile bool generating = false; + SafeFlag generating; ObjectID id; Thread *thread = nullptr; + + // Needed for the bookkeeping of the Map + Preview &operator=(const Preview &p_rhs) { + preview = p_rhs.preview; + base_stream = p_rhs.base_stream; + playback = p_rhs.playback; + generating.set_to(generating.is_set()); + id = p_rhs.id; + thread = p_rhs.thread; + return *this; + } }; Map<ObjectID, Preview> previews; diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp index f4717830bc..11be365f0a 100644 --- a/editor/code_editor.cpp +++ b/editor/code_editor.cpp @@ -723,9 +723,9 @@ void CodeTextEditor::_text_editor_gui_input(const Ref<InputEvent> &p_event) { if (mb.is_valid()) { if (mb->is_pressed() && mb->get_command()) { - if (mb->get_button_index() == BUTTON_WHEEL_UP) { + if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { _zoom_in(); - } else if (mb->get_button_index() == BUTTON_WHEEL_DOWN) { + } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { _zoom_out(); } } @@ -1548,7 +1548,7 @@ void CodeTextEditor::validate_script() { void CodeTextEditor::_warning_label_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { _warning_button_pressed(); } } @@ -1572,7 +1572,7 @@ void CodeTextEditor::_toggle_scripts_pressed() { void CodeTextEditor::_error_pressed(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { goto_error(); } } diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp index 01fa094d38..0c1fb6fe4d 100644 --- a/editor/connections_dialog.cpp +++ b/editor/connections_dialog.cpp @@ -98,7 +98,7 @@ public: } void notify_changed() { - _change_notify(); + notify_property_list_changed(); } ConnectDialogBinds() { diff --git a/editor/create_dialog.cpp b/editor/create_dialog.cpp index 3a63100012..711072f4b2 100644 --- a/editor/create_dialog.cpp +++ b/editor/create_dialog.cpp @@ -170,6 +170,7 @@ void CreateDialog::_update_search() { root->set_text(0, base_type); root->set_icon(0, search_options->get_theme_icon(icon_fallback, "EditorIcons")); search_options_types[base_type] = root; + _configure_search_option_item(root, base_type, ClassDB::class_exists(base_type)); const String search_text = search_box->get_text(); bool empty_search = search_text == ""; @@ -236,7 +237,10 @@ void CreateDialog::_configure_search_option_item(TreeItem *r_item, const String bool can_instance = (p_cpp_type && ClassDB::can_instance(p_type)) || !p_cpp_type; if (!can_instance) { r_item->set_custom_color(0, search_options->get_theme_color("disabled_font_color", "Editor")); + r_item->set_icon(0, EditorNode::get_singleton()->get_class_icon(p_type, "NodeDisabled")); r_item->set_selectable(0, false); + } else { + r_item->set_icon(0, EditorNode::get_singleton()->get_class_icon(p_type, icon_fallback)); } if (search_box->get_text() != "") { @@ -253,7 +257,6 @@ void CreateDialog::_configure_search_option_item(TreeItem *r_item, const String const String &description = DTR(EditorHelp::get_doc_data()->class_list[p_type].brief_description); r_item->set_tooltip(0, description); - r_item->set_icon(0, EditorNode::get_singleton()->get_class_icon(p_type, icon_fallback)); if (!p_cpp_type && !script_type) { Ref<Texture2D> icon = EditorNode::get_editor_data().get_custom_types()[custom_type_parents[p_type]][custom_type_indices[p_type]].icon; diff --git a/editor/debugger/editor_debugger_inspector.h b/editor/debugger/editor_debugger_inspector.h index cf2d81cbf1..6648c99c03 100644 --- a/editor/debugger/editor_debugger_inspector.h +++ b/editor/debugger/editor_debugger_inspector.h @@ -58,7 +58,7 @@ public: prop_values.clear(); } - void update() { _change_notify(); } + void update() { notify_property_list_changed(); } EditorDebuggerRemoteObject() {} }; diff --git a/editor/debugger/editor_debugger_tree.cpp b/editor/debugger/editor_debugger_tree.cpp index 6db3b94aee..ec92edc795 100644 --- a/editor/debugger/editor_debugger_tree.cpp +++ b/editor/debugger/editor_debugger_tree.cpp @@ -129,6 +129,8 @@ void EditorDebuggerTree::update_scene_tree(const SceneDebuggerTree *p_tree, int updating_scene_tree = true; const String last_path = get_selected_path(); const String filter = EditorNode::get_singleton()->get_scene_tree_dock()->get_filter(); + bool filter_changed = filter != last_filter; + TreeItem *scroll_item = nullptr; // Nodes are in a flatten list, depth first. Use a stack of parents, avoid recursion. List<Pair<TreeItem *, int>> parents; @@ -162,11 +164,17 @@ void EditorDebuggerTree::update_scene_tree(const SceneDebuggerTree *p_tree, int if (debugger_id == p_debugger) { // Can use remote id. if (node.id == inspected_object_id) { item->select(0); + if (filter_changed) { + scroll_item = item; + } } } else { // Must use path if (last_path == _get_path(item)) { updating_scene_tree = false; // Force emission of new selection item->select(0); + if (filter_changed) { + scroll_item = item; + } updating_scene_tree = true; } } @@ -183,6 +191,9 @@ void EditorDebuggerTree::update_scene_tree(const SceneDebuggerTree *p_tree, int } parent->remove_child(item); memdelete(item); + if (scroll_item == item) { + scroll_item = nullptr; + } if (had_siblings) { break; // Parent must survive. } @@ -199,6 +210,10 @@ void EditorDebuggerTree::update_scene_tree(const SceneDebuggerTree *p_tree, int } } debugger_id = p_debugger; // Needed by hook, could be avoided if every debugger had its own tree + if (scroll_item) { + call_deferred("scroll_to_item", scroll_item); + } + last_filter = filter; updating_scene_tree = false; } diff --git a/editor/debugger/editor_debugger_tree.h b/editor/debugger/editor_debugger_tree.h index 8c966dffd5..13193344f1 100644 --- a/editor/debugger/editor_debugger_tree.h +++ b/editor/debugger/editor_debugger_tree.h @@ -51,6 +51,7 @@ private: Set<ObjectID> unfold_cache; PopupMenu *item_menu = nullptr; EditorFileDialog *file_dialog = nullptr; + String last_filter; String _get_path(TreeItem *p_item); void _scene_tree_folded(Object *p_obj); diff --git a/editor/debugger/editor_performance_profiler.cpp b/editor/debugger/editor_performance_profiler.cpp index 33d08a2f6b..fc0104c07a 100644 --- a/editor/debugger/editor_performance_profiler.cpp +++ b/editor/debugger/editor_performance_profiler.cpp @@ -249,7 +249,7 @@ TreeItem *EditorPerformanceProfiler::_create_monitor_item(const StringName &p_mo void EditorPerformanceProfiler::_marker_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { Vector<StringName> active; for (OrderedHashMap<StringName, Monitor>::Element i = monitors.front(); i; i = i.next()) { if (i.value().item->is_checked(0)) { diff --git a/editor/debugger/editor_profiler.cpp b/editor/debugger/editor_profiler.cpp index 9304b116d0..c4290b7cca 100644 --- a/editor/debugger/editor_profiler.cpp +++ b/editor/debugger/editor_profiler.cpp @@ -482,7 +482,7 @@ void EditorProfiler::_graph_tex_input(const Ref<InputEvent> &p_ev) { Ref<InputEventMouseMotion> mm = p_ev; if ( - (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) || + (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed()) || (mm.is_valid())) { int x = me->get_position().x; x = x * frame_metrics.size() / graph->get_size().width; @@ -510,7 +510,7 @@ void EditorProfiler::_graph_tex_input(const Ref<InputEvent> &p_ev) { hover_metric = -1; } - if (mb.is_valid() || mm->get_button_mask() & BUTTON_MASK_LEFT) { + if (mb.is_valid() || mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { //cursor_metric=x; updating_frame = true; diff --git a/editor/debugger/editor_visual_profiler.cpp b/editor/debugger/editor_visual_profiler.cpp index d825a980c7..5bb10b3794 100644 --- a/editor/debugger/editor_visual_profiler.cpp +++ b/editor/debugger/editor_visual_profiler.cpp @@ -517,7 +517,7 @@ void EditorVisualProfiler::_graph_tex_input(const Ref<InputEvent> &p_ev) { Ref<InputEventMouseMotion> mm = p_ev; if ( - (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) || + (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed()) || (mm.is_valid())) { int half_w = graph->get_size().width / 2; int x = me->get_position().x; @@ -549,7 +549,7 @@ void EditorVisualProfiler::_graph_tex_input(const Ref<InputEvent> &p_ev) { hover_metric = -1; } - if (mb.is_valid() || mm->get_button_mask() & BUTTON_MASK_LEFT) { + if (mb.is_valid() || mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { //cursor_metric=x; updating_frame = true; diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp index be2b98bf1a..c92e94270e 100644 --- a/editor/debugger/script_editor_debugger.cpp +++ b/editor/debugger/script_editor_debugger.cpp @@ -343,7 +343,7 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da DebuggerMarshalls::ResourceUsage usage; usage.deserialize(p_data); - int total = 0; + uint64_t total = 0; for (List<DebuggerMarshalls::ResourceInfo>::Element *E = usage.infos.front(); E; E = E->next()) { TreeItem *it = vmem_tree->create_item(root); diff --git a/editor/dependency_editor.cpp b/editor/dependency_editor.cpp index 2780b74469..25e155aafe 100644 --- a/editor/dependency_editor.cpp +++ b/editor/dependency_editor.cpp @@ -480,8 +480,8 @@ void DependencyRemoveDialog::ok_pressed() { if (files_to_delete[i] == String(ProjectSettings::get_singleton()->get("application/boot_splash/image"))) { ProjectSettings::get_singleton()->set("application/boot_splash/image", ""); } - if (files_to_delete[i] == String(ProjectSettings::get_singleton()->get("rendering/environment/default_environment"))) { - ProjectSettings::get_singleton()->set("rendering/environment/default_environment", ""); + if (files_to_delete[i] == String(ProjectSettings::get_singleton()->get("rendering/environment/defaults/default_environment"))) { + ProjectSettings::get_singleton()->set("rendering/environment/defaults/default_environment", ""); } if (files_to_delete[i] == String(ProjectSettings::get_singleton()->get("display/mouse_cursor/custom_image"))) { ProjectSettings::get_singleton()->set("display/mouse_cursor/custom_image", ""); @@ -492,8 +492,8 @@ void DependencyRemoveDialog::ok_pressed() { if (files_to_delete[i] == String(ProjectSettings::get_singleton()->get("gui/theme/custom_font"))) { ProjectSettings::get_singleton()->set("gui/theme/custom_font", ""); } - if (files_to_delete[i] == String(ProjectSettings::get_singleton()->get("audio/default_bus_layout"))) { - ProjectSettings::get_singleton()->set("audio/default_bus_layout", ""); + if (files_to_delete[i] == String(ProjectSettings::get_singleton()->get("audio/buses/default_bus_layout"))) { + ProjectSettings::get_singleton()->set("audio/buses/default_bus_layout", ""); } String path = OS::get_singleton()->get_resource_dir() + files_to_delete[i].replace_first("res://", "/"); diff --git a/editor/dictionary_property_edit.cpp b/editor/dictionary_property_edit.cpp index 9683003d89..408177e523 100644 --- a/editor/dictionary_property_edit.cpp +++ b/editor/dictionary_property_edit.cpp @@ -32,11 +32,7 @@ #include "editor_node.h" void DictionaryPropertyEdit::_notif_change() { - _change_notify(); -} - -void DictionaryPropertyEdit::_notif_changev(const String &p_v) { - _change_notify(p_v.utf8().get_data()); + notify_property_list_changed(); } void DictionaryPropertyEdit::_set_key(const Variant &p_old_key, const Variant &p_new_key) { @@ -107,7 +103,6 @@ void DictionaryPropertyEdit::_bind_methods() { ClassDB::bind_method(D_METHOD("_set_key"), &DictionaryPropertyEdit::_set_key); ClassDB::bind_method(D_METHOD("_set_value"), &DictionaryPropertyEdit::_set_value); ClassDB::bind_method(D_METHOD("_notif_change"), &DictionaryPropertyEdit::_notif_change); - ClassDB::bind_method(D_METHOD("_notif_changev"), &DictionaryPropertyEdit::_notif_changev); ClassDB::bind_method(D_METHOD("_dont_undo_redo"), &DictionaryPropertyEdit::_dont_undo_redo); } @@ -128,8 +123,6 @@ bool DictionaryPropertyEdit::_set(const StringName &p_name, const Variant &p_val ur->create_action(TTR("Change Dictionary Key")); ur->add_do_method(this, "_set_key", key, p_value); ur->add_undo_method(this, "_set_key", p_value, key); - ur->add_do_method(this, "_notif_changev", p_name); - ur->add_undo_method(this, "_notif_changev", p_name); ur->commit_action(); return true; @@ -142,8 +135,6 @@ bool DictionaryPropertyEdit::_set(const StringName &p_name, const Variant &p_val ur->create_action(TTR("Change Dictionary Value")); ur->add_do_method(this, "_set_value", key, p_value); ur->add_undo_method(this, "_set_value", key, value); - ur->add_do_method(this, "_notif_changev", p_name); - ur->add_undo_method(this, "_notif_changev", p_name); ur->commit_action(); return true; diff --git a/editor/dictionary_property_edit.h b/editor/dictionary_property_edit.h index 564bbf205b..e0fd945491 100644 --- a/editor/dictionary_property_edit.h +++ b/editor/dictionary_property_edit.h @@ -40,7 +40,6 @@ class DictionaryPropertyEdit : public Reference { StringName property; void _notif_change(); - void _notif_changev(const String &p_v); void _set_key(const Variant &p_old_key, const Variant &p_new_key); void _set_value(const Variant &p_key, const Variant &p_value); diff --git a/editor/doc_tools.cpp b/editor/doc_tools.cpp index 47ea8cbe2a..e29c9593c3 100644 --- a/editor/doc_tools.cpp +++ b/editor/doc_tools.cpp @@ -394,13 +394,22 @@ void DocTools::generate(bool p_basic_types) { method.qualifiers += " "; } method.qualifiers += "const"; - } else if (E->get().flags & METHOD_FLAG_VARARG) { + } + + if (E->get().flags & METHOD_FLAG_VARARG) { if (method.qualifiers != "") { method.qualifiers += " "; } method.qualifiers += "vararg"; } + if (E->get().flags & METHOD_FLAG_STATIC) { + if (method.qualifiers != "") { + method.qualifiers += " "; + } + method.qualifiers += "static"; + } + for (int i = -1; i < E->get().arguments.size(); i++) { if (i == -1) { #ifdef DEBUG_METHODS_ENABLED @@ -647,6 +656,20 @@ void DocTools::generate(bool p_basic_types) { method.qualifiers += "vararg"; } + if (mi.flags & METHOD_FLAG_CONST) { + if (method.qualifiers != "") { + method.qualifiers += " "; + } + method.qualifiers += "const"; + } + + if (mi.flags & METHOD_FLAG_STATIC) { + if (method.qualifiers != "") { + method.qualifiers += " "; + } + method.qualifiers += "static"; + } + c.methods.push_back(method); } diff --git a/editor/editor_audio_buses.cpp b/editor/editor_audio_buses.cpp index 2eef4636d6..3a5ebe8e85 100644 --- a/editor/editor_audio_buses.cpp +++ b/editor/editor_audio_buses.cpp @@ -532,7 +532,7 @@ void EditorAudioBus::_effect_add(int p_which) { void EditorAudioBus::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) { + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) { Vector2 pos = Vector2(mb->get_position().x, mb->get_position().y); bus_popup->set_position(get_global_position() + pos); bus_popup->popup(); @@ -1191,9 +1191,9 @@ void EditorAudioBuses::_load_layout() { } void EditorAudioBuses::_load_default_layout() { - String layout_path = ProjectSettings::get_singleton()->get("audio/default_bus_layout"); + String layout_path = ProjectSettings::get_singleton()->get("audio/buses/default_bus_layout"); - Ref<AudioBusLayout> state = ResourceLoader::load(layout_path, "", true); + Ref<AudioBusLayout> state = ResourceLoader::load(layout_path, "", ResourceFormatLoader::CACHE_MODE_IGNORE); if (state.is_null()) { EditorNode::get_singleton()->show_warning(vformat(TTR("There is no '%s' file."), layout_path)); return; @@ -1209,7 +1209,7 @@ void EditorAudioBuses::_load_default_layout() { void EditorAudioBuses::_file_dialog_callback(const String &p_string) { if (file_dialog->get_file_mode() == EditorFileDialog::FILE_MODE_OPEN_FILE) { - Ref<AudioBusLayout> state = ResourceLoader::load(p_string, "", true); + Ref<AudioBusLayout> state = ResourceLoader::load(p_string, "", ResourceFormatLoader::CACHE_MODE_IGNORE); if (state.is_null()) { EditorNode::get_singleton()->show_warning(TTR("Invalid file, not an audio bus layout.")); return; @@ -1257,7 +1257,7 @@ EditorAudioBuses::EditorAudioBuses() { add_child(top_hb); file = memnew(Label); - String layout_path = ProjectSettings::get_singleton()->get("audio/default_bus_layout"); + String layout_path = ProjectSettings::get_singleton()->get("audio/buses/default_bus_layout"); file->set_text(String(TTR("Layout")) + ": " + layout_path.get_file()); file->set_clip_text(true); file->set_h_size_flags(SIZE_EXPAND_FILL); @@ -1313,7 +1313,7 @@ EditorAudioBuses::EditorAudioBuses() { set_v_size_flags(SIZE_EXPAND_FILL); - edited_path = ProjectSettings::get_singleton()->get("audio/default_bus_layout"); + edited_path = ProjectSettings::get_singleton()->get("audio/buses/default_bus_layout"); file_dialog = memnew(EditorFileDialog); List<String> ext; @@ -1330,7 +1330,7 @@ EditorAudioBuses::EditorAudioBuses() { void EditorAudioBuses::open_layout(const String &p_path) { EditorNode::get_singleton()->make_bottom_panel_item_visible(this); - Ref<AudioBusLayout> state = ResourceLoader::load(p_path, "", true); + Ref<AudioBusLayout> state = ResourceLoader::load(p_path, "", ResourceFormatLoader::CACHE_MODE_IGNORE); if (state.is_null()) { EditorNode::get_singleton()->show_warning(TTR("Invalid file, not an audio bus layout.")); return; diff --git a/editor/editor_data.cpp b/editor/editor_data.cpp index 336bf26607..fa4703d425 100644 --- a/editor/editor_data.cpp +++ b/editor/editor_data.cpp @@ -500,6 +500,7 @@ int EditorData::add_edited_scene(int p_at_pos) { EditedScene es; es.root = nullptr; es.path = String(); + es.file_modified_time = 0; es.history_current = -1; es.version = 0; es.live_edit_root = NodePath(String("/root")); @@ -656,6 +657,10 @@ void EditorData::set_edited_scene_root(Node *p_root) { p_root->set_filename(edited_scene[current_edited_scene].path); } } + + if (edited_scene[current_edited_scene].path != "") { + edited_scene.write[current_edited_scene].file_modified_time = FileAccess::get_modified_time(edited_scene[current_edited_scene].path); + } } int EditorData::get_edited_scene_count() const { @@ -687,6 +692,21 @@ uint64_t EditorData::get_scene_version(int p_idx) const { return edited_scene[p_idx].version; } +void EditorData::set_scene_modified_time(int p_idx, uint64_t p_time) { + if (p_idx == -1) { + p_idx = current_edited_scene; + } + + ERR_FAIL_INDEX(p_idx, edited_scene.size()); + + edited_scene.write[p_idx].file_modified_time = p_time; +} + +uint64_t EditorData::get_scene_modified_time(int p_idx) const { + ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), 0); + return edited_scene[p_idx].file_modified_time; +} + String EditorData::get_scene_type(int p_idx) const { ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), String()); if (!edited_scene[p_idx].root) { @@ -721,7 +741,7 @@ Ref<Script> EditorData::get_scene_root_script(int p_idx) const { return s; } -String EditorData::get_scene_title(int p_idx) const { +String EditorData::get_scene_title(int p_idx, bool p_always_strip_extension) const { ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), String()); if (!edited_scene[p_idx].root) { return TTR("[empty]"); @@ -729,12 +749,28 @@ String EditorData::get_scene_title(int p_idx) const { if (edited_scene[p_idx].root->get_filename() == "") { return TTR("[unsaved]"); } - bool show_ext = EDITOR_DEF("interface/scene_tabs/show_extension", false); - String name = edited_scene[p_idx].root->get_filename().get_file(); - if (!show_ext) { - name = name.get_basename(); + + const String filename = edited_scene[p_idx].root->get_filename().get_file(); + const String basename = filename.get_basename(); + + if (p_always_strip_extension) { + return basename; + } + + // Return the filename including the extension if there's ambiguity (e.g. both `foo.tscn` and `foo.scn` are being edited). + for (int i = 0; i < edited_scene.size(); i++) { + if (i == p_idx) { + // Don't compare the edited scene against itself. + continue; + } + + if (edited_scene[i].root && basename == edited_scene[i].root->get_filename().get_file().get_basename()) { + return filename; + } } - return name; + + // Else, return just the basename as there's no ambiguity. + return basename; } void EditorData::set_scene_path(int p_idx, const String &p_path) { @@ -922,6 +958,14 @@ void EditorData::script_class_save_icon_paths() { } } + Dictionary old; + if (ProjectSettings::get_singleton()->has_setting("_global_script_class_icons")) { + old = ProjectSettings::get_singleton()->get("_global_script_class_icons"); + } + if ((!old.is_empty() || d.is_empty()) && d.hash() == old.hash()) { + return; + } + if (d.is_empty()) { if (ProjectSettings::get_singleton()->has_setting("_global_script_class_icons")) { ProjectSettings::get_singleton()->clear("_global_script_class_icons"); diff --git a/editor/editor_data.h b/editor/editor_data.h index f14a3fb4e0..dbe729d9d9 100644 --- a/editor/editor_data.h +++ b/editor/editor_data.h @@ -111,6 +111,7 @@ public: struct EditedScene { Node *root = nullptr; String path; + uint64_t file_modified_time = 0; Dictionary editor_states; List<Node *> selection; Vector<EditorHistory::History> history_stored; @@ -183,13 +184,15 @@ public: Node *get_edited_scene_root(int p_idx = -1); int get_edited_scene_count() const; Vector<EditedScene> get_edited_scenes() const; - String get_scene_title(int p_idx) const; + String get_scene_title(int p_idx, bool p_always_strip_extension = false) const; String get_scene_path(int p_idx) const; String get_scene_type(int p_idx) const; void set_scene_path(int p_idx, const String &p_path); Ref<Script> get_scene_root_script(int p_idx) const; void set_edited_scene_version(uint64_t version, int p_scene_idx = -1); uint64_t get_scene_version(int p_idx) const; + void set_scene_modified_time(int p_idx, uint64_t p_time); + uint64_t get_scene_modified_time(int p_idx) const; void clear_edited_scenes(); void set_edited_scene_live_edit_root(const NodePath &p_root); NodePath get_edited_scene_live_edit_root(); diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp index 24256b843e..3c0fe1571c 100644 --- a/editor/editor_export.cpp +++ b/editor/editor_export.cpp @@ -301,6 +301,8 @@ void EditorExportPlatform::gen_debug_flags(Vector<String> &r_flags, int p_flags) } Error EditorExportPlatform::_save_pack_file(void *p_userdata, const String &p_path, const Vector<uint8_t> &p_data, int p_file, int p_total, const Vector<String> &p_enc_in_filters, const Vector<String> &p_enc_ex_filters, const Vector<uint8_t> &p_key) { + ERR_FAIL_COND_V_MSG(p_total < 1, ERR_PARAMETER_RANGE_ERROR, "Must select at least one file to export."); + PackData *pd = (PackData *)p_userdata; SavedData sd; @@ -368,6 +370,8 @@ Error EditorExportPlatform::_save_pack_file(void *p_userdata, const String &p_pa } Error EditorExportPlatform::_save_zip_file(void *p_userdata, const String &p_path, const Vector<uint8_t> &p_data, int p_file, int p_total, const Vector<String> &p_enc_in_filters, const Vector<String> &p_enc_ex_filters, const Vector<uint8_t> &p_key) { + ERR_FAIL_COND_V_MSG(p_total < 1, ERR_PARAMETER_RANGE_ERROR, "Must select at least one file to export."); + String path = p_path.replace_first("res://", ""); ZipData *zd = (ZipData *)p_userdata; @@ -507,6 +511,11 @@ void EditorExportPlatform::_edit_files_with_filter(DirAccess *da, const Vector<S if (dir.begins_with(".")) { continue; } + + if (EditorFileSystem::_should_skip_directory(cur_dir + dir)) { + continue; + } + da->change_dir(dir); _edit_files_with_filter(da, p_filters, r_list, exclude); da->change_dir(".."); @@ -819,17 +828,25 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> & } } + Error err = OK; Vector<Ref<EditorExportPlugin>> export_plugins = EditorExport::get_singleton()->get_export_plugins(); + for (int i = 0; i < export_plugins.size(); i++) { export_plugins.write[i]->set_export_preset(p_preset); if (p_so_func) { for (int j = 0; j < export_plugins[i]->shared_objects.size(); j++) { - p_so_func(p_udata, export_plugins[i]->shared_objects[j]); + err = p_so_func(p_udata, export_plugins[i]->shared_objects[j]); + if (err != OK) { + return err; + } } } for (int j = 0; j < export_plugins[i]->extra_files.size(); j++) { - p_func(p_udata, export_plugins[i]->extra_files[j].path, export_plugins[i]->extra_files[j].data, 0, paths.size(), enc_in_filters, enc_ex_filters, key); + err = p_func(p_udata, export_plugins[i]->extra_files[j].path, export_plugins[i]->extra_files[j].data, 0, paths.size(), enc_in_filters, enc_ex_filters, key); + if (err != OK) { + return err; + } } export_plugins.write[i]->_clear(); @@ -851,12 +868,26 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> & //file is imported, replace by what it imports Ref<ConfigFile> config; config.instance(); - Error err = config->load(path + ".import"); + err = config->load(path + ".import"); if (err != OK) { ERR_PRINT("Could not parse: '" + path + "', not exported."); continue; } + String importer_type = config->get_value("remap", "importer"); + + if (importer_type == "keep") { + //just keep file as-is + Vector<uint8_t> array = FileAccess::get_file_as_array(path); + err = p_func(p_udata, path, array, idx, total, enc_in_filters, enc_ex_filters, key); + + if (err != OK) { + return err; + } + + continue; + } + List<String> remaps; config->get_section_keys("remap", &remaps); @@ -915,12 +946,18 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> & } if (p_so_func) { for (int j = 0; j < export_plugins[i]->shared_objects.size(); j++) { - p_so_func(p_udata, export_plugins[i]->shared_objects[j]); + err = p_so_func(p_udata, export_plugins[i]->shared_objects[j]); + if (err != OK) { + return err; + } } } for (int j = 0; j < export_plugins[i]->extra_files.size(); j++) { - p_func(p_udata, export_plugins[i]->extra_files[j].path, export_plugins[i]->extra_files[j].data, idx, total, enc_in_filters, enc_ex_filters, key); + err = p_func(p_udata, export_plugins[i]->extra_files[j].path, export_plugins[i]->extra_files[j].data, idx, total, enc_in_filters, enc_ex_filters, key); + if (err != OK) { + return err; + } if (export_plugins[i]->extra_files[j].remap) { do_export = false; //if remap, do not path_remaps.push_back(path); @@ -940,7 +977,10 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> & //just store it as it comes if (do_export) { Vector<uint8_t> array = FileAccess::get_file_as_array(path); - p_func(p_udata, path, array, idx, total, enc_in_filters, enc_ex_filters, key); + err = p_func(p_udata, path, array, idx, total, enc_in_filters, enc_ex_filters, key); + if (err != OK) { + return err; + } } } @@ -976,7 +1016,10 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> & new_file.write[j] = utf8[j]; } - p_func(p_udata, from + ".remap", new_file, idx, total, enc_in_filters, enc_ex_filters, key); + err = p_func(p_udata, from + ".remap", new_file, idx, total, enc_in_filters, enc_ex_filters, key); + if (err != OK) { + return err; + } } } else { //old remap mode, will still work, but it's unused because it's not multiple pck export friendly @@ -989,11 +1032,17 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> & String splash = ProjectSettings::get_singleton()->get("application/boot_splash/image"); if (icon != String() && FileAccess::exists(icon)) { Vector<uint8_t> array = FileAccess::get_file_as_array(icon); - p_func(p_udata, icon, array, idx, total, enc_in_filters, enc_ex_filters, key); + err = p_func(p_udata, icon, array, idx, total, enc_in_filters, enc_ex_filters, key); + if (err != OK) { + return err; + } } if (splash != String() && FileAccess::exists(splash) && icon != splash) { Vector<uint8_t> array = FileAccess::get_file_as_array(splash); - p_func(p_udata, splash, array, idx, total, enc_in_filters, enc_ex_filters, key); + err = p_func(p_udata, splash, array, idx, total, enc_in_filters, enc_ex_filters, key); + if (err != OK) { + return err; + } } // Store text server data if exists. @@ -1001,7 +1050,10 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> & String ts_data = "res://" + TS->get_support_data_filename(); if (FileAccess::exists(ts_data)) { Vector<uint8_t> array = FileAccess::get_file_as_array(ts_data); - p_func(p_udata, ts_data, array, idx, total, enc_in_filters, enc_ex_filters, key); + err = p_func(p_udata, ts_data, array, idx, total, enc_in_filters, enc_ex_filters, key); + if (err != OK) { + return err; + } } } @@ -1011,9 +1063,7 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> & Vector<uint8_t> data = FileAccess::get_file_as_array(engine_cfb); DirAccess::remove_file_or_error(engine_cfb); - p_func(p_udata, "res://" + config_file, data, idx, total, enc_in_filters, enc_ex_filters, key); - - return OK; + return p_func(p_udata, "res://" + config_file, data, idx, total, enc_in_filters, enc_ex_filters, key); } Error EditorExportPlatform::_add_shared_object(void *p_userdata, const SharedObject &p_so) { @@ -1047,6 +1097,7 @@ Error EditorExportPlatform::save_pack(const Ref<EditorExportPreset> &p_preset, c if (err != OK) { DirAccess::remove_file_or_error(tmppath); + ERR_PRINT("Failed to export project files"); return err; } @@ -1403,9 +1454,9 @@ void EditorExport::add_export_preset(const Ref<EditorExportPreset> &p_preset, in } String EditorExportPlatform::test_etc2() const { - String driver = ProjectSettings::get_singleton()->get("rendering/quality/driver/driver_name"); - bool etc_supported = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc"); - bool etc2_supported = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc2"); + String driver = ProjectSettings::get_singleton()->get("rendering/driver/driver_name"); + bool etc_supported = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc"); + bool etc2_supported = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc2"); if (driver == "GLES2" && !etc_supported) { return TTR("Target platform requires 'ETC' texture compression for GLES2. Enable 'Import Etc' in Project Settings."); @@ -1417,9 +1468,9 @@ String EditorExportPlatform::test_etc2() const { } String EditorExportPlatform::test_etc2_or_pvrtc() const { - String driver = ProjectSettings::get_singleton()->get("rendering/quality/driver/driver_name"); - bool etc2_supported = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc2"); - bool pvrtc_supported = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_pvrtc"); + String driver = ProjectSettings::get_singleton()->get("rendering/driver/driver_name"); + bool etc2_supported = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc2"); + bool pvrtc_supported = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_pvrtc"); if (driver == "GLES2" && !pvrtc_supported) { return TTR("Target platform requires 'PVRTC' texture compression for GLES2. Enable 'Import Pvrtc' in Project Settings."); @@ -1902,7 +1953,7 @@ void EditorExportTextSceneToBinaryPlugin::_export_file(const String &p_path, con return; } - bool convert = GLOBAL_GET("editor/convert_text_resources_to_binary_on_export"); + bool convert = GLOBAL_GET("editor/export/convert_text_resources_to_binary"); if (!convert) { return; } @@ -1922,5 +1973,5 @@ void EditorExportTextSceneToBinaryPlugin::_export_file(const String &p_path, con } EditorExportTextSceneToBinaryPlugin::EditorExportTextSceneToBinaryPlugin() { - GLOBAL_DEF("editor/convert_text_resources_to_binary_on_export", false); + GLOBAL_DEF("editor/export/convert_text_resources_to_binary", false); } diff --git a/editor/editor_feature_profile.cpp b/editor/editor_feature_profile.cpp index af02fcaf3c..bd00d86ec8 100644 --- a/editor/editor_feature_profile.cpp +++ b/editor/editor_feature_profile.cpp @@ -277,11 +277,7 @@ void EditorFeatureProfile::_bind_methods() { BIND_ENUM_CONSTANT(FEATURE_MAX); } -EditorFeatureProfile::EditorFeatureProfile() { - for (int i = 0; i < FEATURE_MAX; i++) { - features_disabled[i] = false; - } -} +EditorFeatureProfile::EditorFeatureProfile() {} ////////////////////////// diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp index 01aad0c41b..f78da9569f 100644 --- a/editor/editor_file_dialog.cpp +++ b/editor/editor_file_dialog.cpp @@ -1076,9 +1076,9 @@ EditorFileDialog::Access EditorFileDialog::get_access() const { } void EditorFileDialog::_make_dir_confirm() { - Error err = dir_access->make_dir(makedirname->get_text()); + Error err = dir_access->make_dir(makedirname->get_text().strip_edges()); if (err == OK) { - dir_access->change_dir(makedirname->get_text()); + dir_access->change_dir(makedirname->get_text().strip_edges()); invalidate(); update_filters(); update_dir(); @@ -1150,7 +1150,6 @@ void EditorFileDialog::_update_drives() { void EditorFileDialog::_favorite_selected(int p_idx) { dir_access->change_dir(favorites->get_item_metadata(p_idx)); - file->set_text(""); update_dir(); invalidate(); _push_history(); diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp index 4b68de26e7..fb0dc57501 100644 --- a/editor/editor_file_system.cpp +++ b/editor/editor_file_system.cpp @@ -405,6 +405,10 @@ bool EditorFileSystem::_test_for_reimport(const String &p_path, bool p_only_impo memdelete(f); + if (importer_name == "keep") { + return false; //keep mode, do not reimport + } + Ref<ResourceImporter> importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(importer_name); if (importer->get_format_version() > version) { @@ -669,10 +673,7 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, DirAccess continue; } - if (FileAccess::exists(cd.plus_file(f).plus_file("project.godot"))) { // skip if another project inside this - continue; - } - if (FileAccess::exists(cd.plus_file(f).plus_file(".gdignore"))) { // skip if another project inside this + if (_should_skip_directory(cd.plus_file(f))) { continue; } @@ -874,10 +875,7 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const int idx = p_dir->find_dir_index(f); if (idx == -1) { - if (FileAccess::exists(cd.plus_file(f).plus_file("project.godot"))) { // skip if another project inside this - continue; - } - if (FileAccess::exists(cd.plus_file(f).plus_file(".gdignore"))) { // skip if another project inside this + if (_should_skip_directory(cd.plus_file(f))) { continue; } @@ -1413,11 +1411,11 @@ void EditorFileSystem::_scan_script_classes(EditorFileSystemDirectory *p_dir) { } void EditorFileSystem::update_script_classes() { - if (!update_script_classes_queued) { + if (!update_script_classes_queued.is_set()) { return; } - update_script_classes_queued = false; + update_script_classes_queued.clear(); ScriptServer::global_classes_clear(); if (get_filesystem()) { _scan_script_classes(get_filesystem()); @@ -1436,11 +1434,11 @@ void EditorFileSystem::update_script_classes() { } void EditorFileSystem::_queue_update_script_classes() { - if (update_script_classes_queued) { + if (update_script_classes_queued.is_set()) { return; } - update_script_classes_queued = true; + update_script_classes_queued.set(); call_deferred("update_script_classes"); } @@ -1538,6 +1536,10 @@ Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector source_file_options[p_files[i]] = Map<StringName, Variant>(); importer_name = file_importer_name; + if (importer_name == "keep") { + continue; //do nothing + } + Ref<ResourceImporter> importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(importer_name); ERR_FAIL_COND_V(!importer.is_valid(), ERR_FILE_CORRUPT); List<ResourceImporter::ImportOption> options; @@ -1561,6 +1563,10 @@ Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector base_paths[p_files[i]] = ResourceFormatImporter::get_singleton()->get_import_base_path(p_files[i]); } + if (importer_name == "keep") { + return OK; // (do nothing) + } + ERR_FAIL_COND_V(importer_name == String(), ERR_UNCONFIGURED); Ref<ResourceImporter> importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(importer_name); @@ -1674,7 +1680,7 @@ Error EditorFileSystem::_reimport_group(const String &p_group_file, const Vector return err; } -void EditorFileSystem::_reimport_file(const String &p_file) { +void EditorFileSystem::_reimport_file(const String &p_file, const Map<StringName, Variant> *p_custom_options, const String &p_custom_importer) { EditorFileSystemDirectory *fs = nullptr; int cpos = -1; bool found = _find_file(p_file, &fs, cpos); @@ -1683,23 +1689,32 @@ void EditorFileSystem::_reimport_file(const String &p_file) { //try to obtain existing params Map<StringName, Variant> params; - String importer_name; + String importer_name; //empty by default though + + if (p_custom_importer != String()) { + importer_name = p_custom_importer; + } + if (p_custom_options != nullptr) { + params = *p_custom_options; + } if (FileAccess::exists(p_file + ".import")) { //use existing - Ref<ConfigFile> cf; - cf.instance(); - Error err = cf->load(p_file + ".import"); - if (err == OK) { - if (cf->has_section("params")) { - List<String> sk; - cf->get_section_keys("params", &sk); - for (List<String>::Element *E = sk.front(); E; E = E->next()) { - params[E->get()] = cf->get_value("params", E->get()); + if (p_custom_options == nullptr) { + Ref<ConfigFile> cf; + cf.instance(); + Error err = cf->load(p_file + ".import"); + if (err == OK) { + if (cf->has_section("params")) { + List<String> sk; + cf->get_section_keys("params", &sk); + for (List<String>::Element *E = sk.front(); E; E = E->next()) { + params[E->get()] = cf->get_value("params", E->get()); + } + } + if (p_custom_importer == String() && cf->has_section("remap")) { + importer_name = cf->get_value("remap", "importer"); } - } - if (cf->has_section("remap")) { - importer_name = cf->get_value("remap", "importer"); } } @@ -1707,6 +1722,16 @@ void EditorFileSystem::_reimport_file(const String &p_file) { late_added_files.insert(p_file); //imported files do not call update_file(), but just in case.. } + if (importer_name == "keep") { + //keep files, do nothing. + fs->files[cpos]->modified_time = FileAccess::get_modified_time(p_file); + fs->files[cpos]->import_modified_time = FileAccess::get_modified_time(p_file + ".import"); + fs->files[cpos]->deps.clear(); + fs->files[cpos]->type = ""; + fs->files[cpos]->import_valid = false; + EditorResourcePreview::get_singleton()->check_for_invalidation(p_file); + return; + } Ref<ResourceImporter> importer; bool load_default = false; //find the importer @@ -1893,6 +1918,10 @@ void EditorFileSystem::_find_group_files(EditorFileSystemDirectory *efd, Map<Str } } +void EditorFileSystem::reimport_file_with_custom_parameters(const String &p_file, const String &p_importer, const Map<StringName, Variant> &p_custom_params) { + _reimport_file(p_file, &p_custom_params, p_importer); +} + void EditorFileSystem::reimport_files(const Vector<String> &p_files) { { // Ensure that ProjectSettings::IMPORTED_FILES_PATH exists. @@ -1979,6 +2008,20 @@ Error EditorFileSystem::_resource_import(const String &p_path) { return OK; } +bool EditorFileSystem::_should_skip_directory(const String &p_path) { + if (FileAccess::exists(p_path.plus_file("project.godot"))) { + // skip if another project inside this + return true; + } + + if (FileAccess::exists(p_path.plus_file(".gdignore"))) { + // skip if a `.gdignore` file is inside this + return true; + } + + return false; +} + bool EditorFileSystem::is_group_file(const String &p_path) const { return group_file_cache.has(p_path); } @@ -2067,7 +2110,7 @@ void EditorFileSystem::_update_extensions() { EditorFileSystem::EditorFileSystem() { ResourceLoader::import = _resource_import; - reimport_on_missing_imported_files = GLOBAL_DEF("editor/reimport_missing_imported_files", true); + reimport_on_missing_imported_files = GLOBAL_DEF("editor/import/reimport_missing_imported_files", true); singleton = this; filesystem = memnew(EditorFileSystemDirectory); //like, empty @@ -2091,7 +2134,7 @@ EditorFileSystem::EditorFileSystem() { memdelete(da); scan_total = 0; - update_script_classes_queued = false; + update_script_classes_queued.clear(); first_scan = true; scan_changes_pending = false; revalidate_import_files = false; diff --git a/editor/editor_file_system.h b/editor/editor_file_system.h index fa0b89e667..6f4f058503 100644 --- a/editor/editor_file_system.h +++ b/editor/editor_file_system.h @@ -34,6 +34,7 @@ #include "core/os/dir_access.h" #include "core/os/thread.h" #include "core/os/thread_safe.h" +#include "core/templates/safe_refcount.h" #include "core/templates/set.h" #include "scene/main/node.h" class FileAccess; @@ -202,7 +203,7 @@ class EditorFileSystem : public Node { void _update_extensions(); - void _reimport_file(const String &p_file); + void _reimport_file(const String &p_file, const Map<StringName, Variant> *p_custom_options = nullptr, const String &p_custom_importer = String()); Error _reimport_group(const String &p_group_file, const Vector<String> &p_files); bool _test_for_reimport(const String &p_path, bool p_only_imported_files); @@ -220,7 +221,7 @@ class EditorFileSystem : public Node { }; void _scan_script_classes(EditorFileSystemDirectory *p_dir); - volatile bool update_script_classes_queued; + SafeFlag update_script_classes_queued; void _queue_update_script_classes(); String _get_global_script_class(const String &p_type, const String &p_path, String *r_extends, String *r_icon_path) const; @@ -256,11 +257,15 @@ public: void reimport_files(const Vector<String> &p_files); + void reimport_file_with_custom_parameters(const String &p_file, const String &p_importer, const Map<StringName, Variant> &p_custom_params); + void update_script_classes(); bool is_group_file(const String &p_path) const; void move_group_file(const String &p_path, const String &p_new_path); + static bool _should_skip_directory(const String &p_path); + EditorFileSystem(); ~EditorFileSystem(); }; diff --git a/editor/editor_folding.cpp b/editor/editor_folding.cpp index 9f98795e16..97a2c67c26 100644 --- a/editor/editor_folding.cpp +++ b/editor/editor_folding.cpp @@ -259,13 +259,17 @@ void EditorFolding::_do_object_unfolds(Object *p_object, Set<RES> &resources) { } } } - } - if (E->get().type == Variant::OBJECT) { - RES res = p_object->get(E->get().name); - if (res.is_valid() && !resources.has(res) && res->get_path() != String() && !res->get_path().is_resource_file()) { - resources.insert(res); - _do_object_unfolds(res.ptr(), resources); + if (E->get().type == Variant::OBJECT) { + RES res = p_object->get(E->get().name); + print_line("res: " + String(E->get().name) + " valid " + itos(res.is_valid())); + if (res.is_valid()) { + print_line("path " + res->get_path()); + } + if (res.is_valid() && !resources.has(res) && res->get_path() != String() && !res->get_path().is_resource_file()) { + resources.insert(res); + _do_object_unfolds(res.ptr(), resources); + } } } } diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index ac36b7e762..70d1a514b5 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -81,7 +81,7 @@ Size2 EditorProperty::get_minimum_size() const { } if (bottom_editor != nullptr && bottom_editor->is_visible()) { - ms.height += get_theme_constant("vseparation", "Tree"); + ms.height += get_theme_constant("vseparation"); Size2 bems = bottom_editor->get_combined_minimum_size(); //bems.width += get_constant("item_margin", "Tree"); ms.height += bems.height; @@ -95,6 +95,7 @@ void EditorProperty::emit_changed(const StringName &p_property, const Variant &p Variant args[4] = { p_property, p_value, p_field, p_changing }; const Variant *argptrs[4] = { &args[0], &args[1], &args[2], &args[3] }; + cache[p_property] = p_value; emit_signal("property_changed", (const Variant **)argptrs, 4); } @@ -148,7 +149,7 @@ void EditorProperty::_notification(int p_what) { if (bottom_editor) { int m = 0; //get_constant("item_margin", "Tree"); - bottom_rect = Rect2(m, rect.size.height + get_theme_constant("vseparation", "Tree"), size.width - m, bottom_editor->get_combined_minimum_size().height); + bottom_rect = Rect2(m, rect.size.height + get_theme_constant("vseparation"), size.width - m, bottom_editor->get_combined_minimum_size().height); } if (keying) { @@ -225,11 +226,15 @@ void EditorProperty::_notification(int p_what) { size.height = label_reference->get_size().height; } + Ref<StyleBox> sb; if (selected) { - Ref<StyleBox> sb = get_theme_stylebox("selected", "Tree"); - draw_style_box(sb, Rect2(Vector2(), size)); + sb = get_theme_stylebox("bg_selected"); + } else { + sb = get_theme_stylebox("bg"); } + draw_style_box(sb, Rect2(Vector2(), size)); + if (draw_top_bg && right_child_rect != Rect2()) { draw_rect(right_child_rect, dark_color); } @@ -239,15 +244,15 @@ void EditorProperty::_notification(int p_what) { Color color; if (draw_red) { - color = get_theme_color("error_color", "Editor"); + color = get_theme_color("error_color"); } else { - color = get_theme_color("property_color", "Editor"); + color = get_theme_color("property_color"); } if (label.find(".") != -1) { color.a = 0.5; //this should be un-hacked honestly, as it's used for editor overrides } - int ofs = 0; + int ofs = get_theme_constant("font_offset"); int text_limit = text_size; if (checkable) { @@ -688,7 +693,7 @@ void EditorProperty::_gui_input(const Ref<InputEvent> &p_event) { if (is_layout_rtl()) { mpos.x = get_size().x - mpos.x; } - bool button_left = me->get_button_mask() & BUTTON_MASK_LEFT; + bool button_left = me->get_button_mask() & MOUSE_BUTTON_MASK_LEFT; bool new_keying_hover = keying_rect.has_point(mpos) && !button_left; if (new_keying_hover != keying_hover) { @@ -717,7 +722,7 @@ void EditorProperty::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { Vector2 mpos = mb->get_position(); if (is_layout_rtl()) { mpos.x = get_size().x - mpos.x; @@ -805,6 +810,28 @@ void EditorProperty::set_bottom_editor(Control *p_control) { bottom_editor = p_control; } +bool EditorProperty::is_cache_valid() const { + if (object) { + for (Map<StringName, Variant>::Element *E = cache.front(); E; E = E->next()) { + bool valid; + Variant value = object->get(E->key(), &valid); + if (!valid || value != E->get()) { + return false; + } + } + } + return true; +} +void EditorProperty::update_cache() { + cache.clear(); + if (object && property != StringName()) { + bool valid; + Variant value = object->get(property, &valid); + if (valid) { + cache[property] = value; + } + } +} Variant EditorProperty::get_drag_data(const Point2 &p_point) { if (property == StringName()) { return Variant(); @@ -1332,7 +1359,7 @@ void EditorInspectorSection::_gui_input(const Ref<InputEvent> &p_event) { } Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { Ref<Font> font = get_theme_font("font", "Tree"); int font_size = get_theme_font_size("font_size", "Tree"); if (mb->get_position().y > font->get_height(font_size)) { //clicked outside @@ -1524,6 +1551,7 @@ void EditorInspector::_parse_added_editors(VBoxContainer *current_vbox, Ref<Edit ep->update_property(); ep->update_reload_status(); ep->set_deletable(deletable_properties); + ep->update_cache(); } } ped->added_editors.clear(); @@ -1661,7 +1689,7 @@ void EditorInspector::update_tree() { bool valid = true; //if no properties in category, skip while (N) { - if (N->get().usage & PROPERTY_USAGE_EDITOR) { + if (N->get().usage & PROPERTY_USAGE_EDITOR && (!restrict_to_basic || (N->get().usage & PROPERTY_USAGE_EDITOR_BASIC_SETTING))) { break; } if (N->get().usage & PROPERTY_USAGE_CATEGORY) { @@ -1729,10 +1757,14 @@ void EditorInspector::update_tree() { continue; - } else if (!(p.usage & PROPERTY_USAGE_EDITOR) || _is_property_disabled_by_feature_profile(p.name)) { + } else if (!(p.usage & PROPERTY_USAGE_EDITOR) || _is_property_disabled_by_feature_profile(p.name) || (restrict_to_basic && !(p.usage & PROPERTY_USAGE_EDITOR_BASIC_SETTING))) { continue; } + if (p.name == "script") { + category_vbox = nullptr; // script should go into its own category + } + if (p.usage & PROPERTY_USAGE_HIGH_END_GFX && RS::get_singleton()->is_low_end()) { continue; //do not show this property in low end gfx } @@ -1982,6 +2014,7 @@ void EditorInspector::update_tree() { } ep->update_property(); ep->update_reload_status(); + ep->update_cache(); if (current_selected && ep->property == current_selected) { ep->select(current_focusable); @@ -2012,6 +2045,7 @@ void EditorInspector::update_property(const String &p_prop) { for (List<EditorProperty *>::Element *E = editor_property_map[p_prop].front(); E; E = E->next()) { E->get()->update_property(); E->get()->update_reload_status(); + E->get()->update_cache(); } } @@ -2027,13 +2061,6 @@ void EditorInspector::_clear() { restart_request_props.clear(); } -void EditorInspector::refresh() { - if (refresh_countdown > 0 || changing) { - return; - } - refresh_countdown = EditorSettings::get_singleton()->get("docks/property_editor/auto_refresh_interval"); -} - Object *EditorInspector::get_edited_object() { return object; } @@ -2044,7 +2071,7 @@ void EditorInspector::edit(Object *p_object) { } if (object) { _clear(); - object->remove_change_receptor(this); + object->disconnect("property_list_changed", callable_mp(this, &EditorInspector::_changed_callback)); } object = p_object; @@ -2054,7 +2081,7 @@ void EditorInspector::edit(Object *p_object) { if (scroll_cache.has(object->get_instance_id())) { //if exists, set something else update_scroll_request = scroll_cache[object->get_instance_id()]; //done this way because wait until full size is accommodated } - object->add_change_receptor(this); + object->connect("property_list_changed", callable_mp(this, &EditorInspector::_changed_callback)); update_tree(); } } @@ -2161,17 +2188,30 @@ void EditorInspector::set_use_wide_editors(bool p_enable) { wide_editors = p_enable; } +void EditorInspector::_update_inspector_bg() { + if (sub_inspector) { + int count_subinspectors = 0; + Node *n = get_parent(); + while (n) { + EditorInspector *ei = Object::cast_to<EditorInspector>(n); + if (ei && ei->sub_inspector) { + count_subinspectors++; + } + n = n->get_parent(); + } + count_subinspectors = MIN(15, count_subinspectors); + add_theme_style_override("bg", get_theme_stylebox("sub_inspector_bg" + itos(count_subinspectors), "Editor")); + } else { + add_theme_style_override("bg", get_theme_stylebox("bg", "Tree")); + } +} void EditorInspector::set_sub_inspector(bool p_enable) { sub_inspector = p_enable; if (!is_inside_tree()) { return; } - if (sub_inspector) { - add_theme_style_override("bg", get_theme_stylebox("sub_inspector_bg", "Editor")); - } else { - add_theme_style_override("bg", get_theme_stylebox("bg", "Tree")); - } + _update_inspector_bg(); } void EditorInspector::set_use_deletable_properties(bool p_enabled) { @@ -2351,6 +2391,7 @@ void EditorInspector::_property_checked(const String &p_path, bool p_checked) { for (List<EditorProperty *>::Element *E = editor_property_map[p_path].front(); E; E = E->next()) { E->get()->update_property(); E->get()->update_reload_status(); + E->get()->update_cache(); } } @@ -2394,13 +2435,12 @@ 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)); + set_process(is_visible_in_tree()); + _update_inspector_bg(); } if (p_what == NOTIFICATION_ENTER_TREE) { - if (sub_inspector) { - add_theme_style_override("bg", get_theme_stylebox("sub_inspector_bg", "Editor")); - } else { - add_theme_style_override("bg", get_theme_stylebox("bg", "Tree")); + if (!sub_inspector) { get_tree()->connect("node_removed", callable_mp(this, &EditorInspector::_node_removed)); } } @@ -2414,6 +2454,10 @@ void EditorInspector::_notification(int p_what) { edit(nullptr); } + if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { + set_process(is_visible_in_tree()); + } + if (p_what == NOTIFICATION_PROCESS) { if (update_scroll_request >= 0) { get_v_scrollbar()->call_deferred("set_value", update_scroll_request); @@ -2424,10 +2468,14 @@ void EditorInspector::_notification(int p_what) { if (refresh_countdown <= 0) { for (Map<StringName, List<EditorProperty *>>::Element *F = editor_property_map.front(); F; F = F->next()) { for (List<EditorProperty *>::Element *E = F->get().front(); E; E = E->next()) { - E->get()->update_property(); - E->get()->update_reload_status(); + if (!E->get()->is_cache_valid()) { + E->get()->update_property(); + E->get()->update_reload_status(); + E->get()->update_cache(); + } } } + refresh_countdown = float(EditorSettings::get_singleton()->get("docks/property_editor/auto_refresh_interval")); } } @@ -2445,6 +2493,7 @@ void EditorInspector::_notification(int p_what) { for (List<EditorProperty *>::Element *E = editor_property_map[prop].front(); E; E = E->next()) { E->get()->update_property(); E->get()->update_reload_status(); + E->get()->update_cache(); } } pending.erase(pending.front()); @@ -2455,19 +2504,17 @@ void EditorInspector::_notification(int p_what) { } if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) { - if (sub_inspector) { - add_theme_style_override("bg", get_theme_stylebox("sub_inspector_bg", "Editor")); - } else if (is_inside_tree()) { - add_theme_style_override("bg", get_theme_stylebox("bg", "Tree")); - } + _update_inspector_bg(); update_tree(); } } -void EditorInspector::_changed_callback(Object *p_changed, const char *p_prop) { - //this is called when property change is notified via _change_notify() - _edit_request_change(p_changed, p_prop); +void EditorInspector::_changed_callback() { + //this is called when property change is notified via notify_property_list_changed() + if (object != nullptr) { + _edit_request_change(object, String()); + } } void EditorInspector::_vscroll_changed(double p_offset) { @@ -2577,11 +2624,14 @@ void EditorInspector::_update_script_class_properties(const Object &p_object, Li r_list.erase(bottom); } +void EditorInspector::set_restrict_to_basic_settings(bool p_restrict) { + restrict_to_basic = p_restrict; + update_tree(); +} + void EditorInspector::_bind_methods() { ClassDB::bind_method("_edit_request_change", &EditorInspector::_edit_request_change); - ClassDB::bind_method("refresh", &EditorInspector::refresh); - ADD_SIGNAL(MethodInfo("property_selected", PropertyInfo(Variant::STRING, "property"))); ADD_SIGNAL(MethodInfo("property_keyed", PropertyInfo(Variant::STRING, "property"))); ADD_SIGNAL(MethodInfo("property_deleted", PropertyInfo(Variant::STRING, "property"))); @@ -2613,16 +2663,21 @@ EditorInspector::EditorInspector() { use_folding = false; update_all_pending = false; update_tree_pending = false; - refresh_countdown = 0; read_only = false; search_box = nullptr; keying = false; _prop_edited = "property_edited"; - set_process(true); + set_process(false); property_focusable = -1; sub_inspector = false; deletable_properties = false; get_v_scrollbar()->connect("value_changed", callable_mp(this, &EditorInspector::_vscroll_changed)); update_scroll_request = -1; + if (EditorSettings::get_singleton()) { + refresh_countdown = float(EditorSettings::get_singleton()->get("docks/property_editor/auto_refresh_interval")); + } else { + //used when class is created by the docgen to dump default values of everything bindable, editorsettings may not be created + refresh_countdown = 0.33; + } } diff --git a/editor/editor_inspector.h b/editor/editor_inspector.h index 81a22d4ff1..18250780be 100644 --- a/editor/editor_inspector.h +++ b/editor/editor_inspector.h @@ -98,6 +98,8 @@ private: mutable String tooltip_text; + Map<StringName, Variant> cache; + protected: void _notification(int p_what); static void _bind_methods(); @@ -152,6 +154,8 @@ public: virtual void collapse_all_folding(); virtual Variant get_drag_data(const Point2 &p_point) override; + virtual void update_cache(); + virtual bool is_cache_valid() const; void set_selectable(bool p_selectable); bool is_selectable() const; @@ -309,6 +313,8 @@ class EditorInspector : public ScrollContainer { String property_prefix; //used for sectioned inspector String object_class; + bool restrict_to_basic = false; + void _edit_set(const String &p_name, const Variant &p_value, bool p_refresh_all, const String &p_changed_field); void _property_changed(const String &p_path, const Variant &p_value, const String &p_name = "", bool p_changing = false); @@ -326,7 +332,7 @@ class EditorInspector : public ScrollContainer { void _node_removed(Node *p_node); - void _changed_callback(Object *p_changed, const char *p_prop) override; + void _changed_callback(); void _edit_request_change(Object *p_object, const String &p_prop); void _filter_changed(const String &p_text); @@ -339,6 +345,8 @@ class EditorInspector : public ScrollContainer { bool _is_property_disabled_by_feature_profile(const StringName &p_property); + void _update_inspector_bg(); + protected: static void _bind_methods(); void _notification(int p_what); @@ -356,9 +364,6 @@ public: void update_tree(); void update_property(const String &p_prop); - - void refresh(); - void edit(Object *p_object); Object *get_edited_object(); @@ -393,9 +398,12 @@ public: void set_use_wide_editors(bool p_enable); void set_sub_inspector(bool p_enable); + bool is_sub_inspector() const { return sub_inspector; } void set_use_deletable_properties(bool p_enabled); + void set_restrict_to_basic_settings(bool p_restrict); + EditorInspector(); }; diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 040f1b1640..756f1d208f 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -102,6 +102,7 @@ #include "editor/import/resource_importer_texture.h" #include "editor/import/resource_importer_texture_atlas.h" #include "editor/import/resource_importer_wav.h" +#include "editor/import/scene_import_settings.h" #include "editor/import/scene_importer_mesh_node_3d.h" #include "editor/import_dock.h" #include "editor/multi_node_edit.h" @@ -430,6 +431,74 @@ void EditorNode::_unhandled_input(const Ref<InputEvent> &p_event) { } } +void EditorNode::_update_from_settings() { + int current_filter = GLOBAL_GET("rendering/textures/canvas_textures/default_texture_filter"); + if (current_filter != scene_root->get_default_canvas_item_texture_filter()) { + Viewport::DefaultCanvasItemTextureFilter tf = (Viewport::DefaultCanvasItemTextureFilter)current_filter; + scene_root->set_default_canvas_item_texture_filter(tf); + } + int current_repeat = GLOBAL_GET("rendering/textures/canvas_textures/default_texture_repeat"); + if (current_repeat != scene_root->get_default_canvas_item_texture_repeat()) { + Viewport::DefaultCanvasItemTextureRepeat tr = (Viewport::DefaultCanvasItemTextureRepeat)current_repeat; + scene_root->set_default_canvas_item_texture_repeat(tr); + } + + RS::DOFBokehShape dof_shape = RS::DOFBokehShape(int(GLOBAL_GET("rendering/camera/depth_of_field/depth_of_field_bokeh_shape"))); + RS::get_singleton()->camera_effects_set_dof_blur_bokeh_shape(dof_shape); + RS::DOFBlurQuality dof_quality = RS::DOFBlurQuality(int(GLOBAL_GET("rendering/camera/depth_of_field/depth_of_field_bokeh_quality"))); + bool dof_jitter = GLOBAL_GET("rendering/camera/depth_of_field/depth_of_field_use_jitter"); + RS::get_singleton()->camera_effects_set_dof_blur_quality(dof_quality, dof_jitter); + RS::get_singleton()->environment_set_ssao_quality(RS::EnvironmentSSAOQuality(int(GLOBAL_GET("rendering/environment/ssao/quality"))), GLOBAL_GET("rendering/environment/ssao/half_size"), GLOBAL_GET("rendering/environment/ssao/adaptive_target"), GLOBAL_GET("rendering/environment/ssao/blur_passes"), GLOBAL_GET("rendering/environment/ssao/fadeout_from"), GLOBAL_GET("rendering/environment/ssao/fadeout_to")); + RS::get_singleton()->screen_space_roughness_limiter_set_active(GLOBAL_GET("rendering/anti_aliasing/screen_space_roughness_limiter/enabled"), GLOBAL_GET("rendering/anti_aliasing/screen_space_roughness_limiter/amount"), GLOBAL_GET("rendering/anti_aliasing/screen_space_roughness_limiter/limit")); + bool glow_bicubic = int(GLOBAL_GET("rendering/environment/glow/upscale_mode")) > 0; + RS::get_singleton()->environment_glow_set_use_bicubic_upscale(glow_bicubic); + bool glow_high_quality = GLOBAL_GET("rendering/environment/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/environment/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/environment/subsurface_scattering/subsurface_scattering_quality"))); + RS::get_singleton()->sub_surface_scattering_set_quality(sss_quality); + float sss_scale = GLOBAL_GET("rendering/environment/subsurface_scattering/subsurface_scattering_scale"); + float sss_depth_scale = GLOBAL_GET("rendering/environment/subsurface_scattering/subsurface_scattering_depth_scale"); + RS::get_singleton()->sub_surface_scattering_set_scale(sss_scale, sss_depth_scale); + + uint32_t directional_shadow_size = GLOBAL_GET("rendering/shadows/directional_shadow/size"); + uint32_t directional_shadow_16_bits = GLOBAL_GET("rendering/shadows/directional_shadow/16_bits"); + RS::get_singleton()->directional_shadow_atlas_set_size(directional_shadow_size, directional_shadow_16_bits); + + RS::ShadowQuality shadows_quality = RS::ShadowQuality(int(GLOBAL_GET("rendering/shadows/shadows/soft_shadow_quality"))); + RS::get_singleton()->shadows_quality_set(shadows_quality); + RS::ShadowQuality directional_shadow_quality = RS::ShadowQuality(int(GLOBAL_GET("rendering/shadows/directional_shadow/soft_shadow_quality"))); + RS::get_singleton()->directional_shadow_quality_set(directional_shadow_quality); + float probe_update_speed = GLOBAL_GET("rendering/lightmapping/probe_capture/update_speed"); + RS::get_singleton()->lightmap_set_probe_capture_update_speed(probe_update_speed); + RS::EnvironmentSDFGIFramesToConverge frames_to_converge = RS::EnvironmentSDFGIFramesToConverge(int(GLOBAL_GET("rendering/global_illumination/sdfgi/frames_to_converge"))); + RS::get_singleton()->environment_set_sdfgi_frames_to_converge(frames_to_converge); + RS::EnvironmentSDFGIRayCount ray_count = RS::EnvironmentSDFGIRayCount(int(GLOBAL_GET("rendering/global_illumination/sdfgi/probe_ray_count"))); + RS::get_singleton()->environment_set_sdfgi_ray_count(ray_count); + RS::GIProbeQuality gi_probe_quality = RS::GIProbeQuality(int(GLOBAL_GET("rendering/global_illumination/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/environment/volumetric_fog/volume_size"), GLOBAL_GET("rendering/environment/volumetric_fog/volume_depth")); + RS::get_singleton()->environment_set_volumetric_fog_filter_active(bool(GLOBAL_GET("rendering/environment/volumetric_fog/use_filter"))); + RS::get_singleton()->canvas_set_shadow_texture_size(GLOBAL_GET("rendering/2d/shadow_atlas/size")); + + bool use_half_res_gi = GLOBAL_DEF("rendering/global_illumination/gi/use_half_resolution", false); + RS::get_singleton()->gi_set_use_half_resolution(use_half_res_gi); + + bool snap_2d_transforms = GLOBAL_GET("rendering/2d/snap/snap_2d_transforms_to_pixel"); + scene_root->set_snap_2d_transforms_to_pixel(snap_2d_transforms); + bool snap_2d_vertices = GLOBAL_GET("rendering/2d/snap/snap_2d_vertices_to_pixel"); + scene_root->set_snap_2d_vertices_to_pixel(snap_2d_vertices); + + Viewport::SDFOversize sdf_oversize = Viewport::SDFOversize(int(GLOBAL_GET("rendering/2d/sdf/oversize"))); + scene_root->set_sdf_oversize(sdf_oversize); + Viewport::SDFScale sdf_scale = Viewport::SDFScale(int(GLOBAL_GET("rendering/2d/sdf/scale"))); + scene_root->set_sdf_scale(sdf_scale); + + float lod_threshold = GLOBAL_GET("rendering/mesh_lod/lod_change/threshold_pixels"); + scene_root->set_lod_threshold(lod_threshold); +} + void EditorNode::_notification(int p_what) { switch (p_what) { case NOTIFICATION_PROCESS: { @@ -468,77 +537,13 @@ void EditorNode::_notification(int p_what) { editor_selection->update(); - { //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()) { - Viewport::DefaultCanvasItemTextureFilter tf = (Viewport::DefaultCanvasItemTextureFilter)current_filter; - scene_root->set_default_canvas_item_texture_filter(tf); - } - int current_repeat = GLOBAL_GET("rendering/canvas_textures/default_texture_repeat"); - if (current_repeat != scene_root->get_default_canvas_item_texture_repeat()) { - Viewport::DefaultCanvasItemTextureRepeat tr = (Viewport::DefaultCanvasItemTextureRepeat)current_repeat; - scene_root->set_default_canvas_item_texture_repeat(tr); - } + ResourceImporterTexture::get_singleton()->update_imports(); - RS::DOFBokehShape dof_shape = RS::DOFBokehShape(int(GLOBAL_GET("rendering/quality/depth_of_field/depth_of_field_bokeh_shape"))); - RS::get_singleton()->camera_effects_set_dof_blur_bokeh_shape(dof_shape); - RS::DOFBlurQuality dof_quality = RS::DOFBlurQuality(int(GLOBAL_GET("rendering/quality/depth_of_field/depth_of_field_bokeh_quality"))); - bool dof_jitter = GLOBAL_GET("rendering/quality/depth_of_field/depth_of_field_use_jitter"); - RS::get_singleton()->camera_effects_set_dof_blur_quality(dof_quality, dof_jitter); - RS::get_singleton()->environment_set_ssao_quality(RS::EnvironmentSSAOQuality(int(GLOBAL_GET("rendering/quality/ssao/quality"))), GLOBAL_GET("rendering/quality/ssao/half_size"), GLOBAL_GET("rendering/quality/ssao/adaptive_target"), GLOBAL_GET("rendering/quality/ssao/blur_passes"), GLOBAL_GET("rendering/quality/ssao/fadeout_from"), GLOBAL_GET("rendering/quality/ssao/fadeout_to")); - 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"))); - RS::get_singleton()->sub_surface_scattering_set_quality(sss_quality); - float sss_scale = GLOBAL_GET("rendering/quality/subsurface_scattering/subsurface_scattering_scale"); - float sss_depth_scale = GLOBAL_GET("rendering/quality/subsurface_scattering/subsurface_scattering_depth_scale"); - RS::get_singleton()->sub_surface_scattering_set_scale(sss_scale, sss_depth_scale); - - uint32_t directional_shadow_size = GLOBAL_GET("rendering/quality/directional_shadow/size"); - uint32_t directional_shadow_16_bits = GLOBAL_GET("rendering/quality/directional_shadow/16_bits"); - RS::get_singleton()->directional_shadow_atlas_set_size(directional_shadow_size, directional_shadow_16_bits); - - RS::ShadowQuality shadows_quality = RS::ShadowQuality(int(GLOBAL_GET("rendering/quality/shadows/soft_shadow_quality"))); - RS::get_singleton()->shadows_quality_set(shadows_quality); - RS::ShadowQuality directional_shadow_quality = RS::ShadowQuality(int(GLOBAL_GET("rendering/quality/directional_shadow/soft_shadow_quality"))); - RS::get_singleton()->directional_shadow_quality_set(directional_shadow_quality); - float probe_update_speed = GLOBAL_GET("rendering/lightmapper/probe_capture_update_speed"); - RS::get_singleton()->lightmap_set_probe_capture_update_speed(probe_update_speed); - RS::EnvironmentSDFGIFramesToConverge frames_to_converge = RS::EnvironmentSDFGIFramesToConverge(int(GLOBAL_GET("rendering/sdfgi/frames_to_converge"))); - RS::get_singleton()->environment_set_sdfgi_frames_to_converge(frames_to_converge); - RS::EnvironmentSDFGIRayCount ray_count = RS::EnvironmentSDFGIRayCount(int(GLOBAL_GET("rendering/sdfgi/probe_ray_count"))); - 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")); - RS::get_singleton()->canvas_set_shadow_texture_size(GLOBAL_GET("rendering/quality/2d_shadow_atlas/size")); - - bool use_half_res_gi = GLOBAL_DEF("rendering/quality/gi/use_half_resolution", false); - RS::get_singleton()->gi_set_use_half_resolution(use_half_res_gi); - - bool snap_2d_transforms = GLOBAL_GET("rendering/quality/2d/snap_2d_transforms_to_pixel"); - scene_root->set_snap_2d_transforms_to_pixel(snap_2d_transforms); - bool snap_2d_vertices = GLOBAL_GET("rendering/quality/2d/snap_2d_vertices_to_pixel"); - scene_root->set_snap_2d_vertices_to_pixel(snap_2d_vertices); - - Viewport::SDFOversize sdf_oversize = Viewport::SDFOversize(int(GLOBAL_GET("rendering/quality/2d_sdf/oversize"))); - scene_root->set_sdf_oversize(sdf_oversize); - Viewport::SDFScale sdf_scale = Viewport::SDFScale(int(GLOBAL_GET("rendering/quality/2d_sdf/scale"))); - scene_root->set_sdf_scale(sdf_scale); - - float lod_threshold = GLOBAL_GET("rendering/quality/mesh_lod/threshold_pixels"); - scene_root->set_lod_threshold(lod_threshold); + if (settings_changed) { + _update_from_settings(); + settings_changed = false; + emit_signal("project_settings_changed"); } - - ResourceImporterTexture::get_singleton()->update_imports(); } break; case NOTIFICATION_ENTER_TREE: { @@ -596,6 +601,7 @@ void EditorNode::_notification(int p_what) { OS::get_singleton()->set_low_processor_usage_mode_sleep_usec(int(EDITOR_GET("interface/editor/low_processor_mode_sleep_usec"))); EditorFileSystem::get_singleton()->scan_changes(); + _scan_external_changes(); } break; case NOTIFICATION_APPLICATION_FOCUS_OUT: { @@ -888,6 +894,83 @@ void EditorNode::_sources_changed(bool p_exist) { } } +void EditorNode::_scan_external_changes() { + disk_changed_list->clear(); + TreeItem *r = disk_changed_list->create_item(); + disk_changed_list->set_hide_root(true); + bool need_reload = false; + + // Check if any edited scene has changed. + + for (int i = 0; i < editor_data.get_edited_scene_count(); i++) { + DirAccessRef da = DirAccess::create(DirAccess::ACCESS_RESOURCES); + if (editor_data.get_scene_path(i) == "" || !da->file_exists(editor_data.get_scene_path(i))) { + continue; + } + + uint64_t last_date = editor_data.get_scene_modified_time(i); + uint64_t date = FileAccess::get_modified_time(editor_data.get_scene_path(i)); + + if (date > last_date) { + TreeItem *ti = disk_changed_list->create_item(r); + ti->set_text(0, editor_data.get_scene_path(i).get_file()); + need_reload = true; + } + } + + String project_settings_path = ProjectSettings::get_singleton()->get_resource_path().plus_file("project.godot"); + if (FileAccess::get_modified_time(project_settings_path) > ProjectSettings::get_singleton()->get_last_saved_time()) { + TreeItem *ti = disk_changed_list->create_item(r); + ti->set_text(0, "project.godot"); + need_reload = true; + } + + if (need_reload) { + disk_changed->call_deferred("popup_centered_ratio", 0.5); + } +} + +void EditorNode::_resave_scenes(String p_str) { + save_all_scenes(); + ProjectSettings::get_singleton()->save(); + disk_changed->hide(); +} + +void EditorNode::_reload_modified_scenes() { + int current_idx = editor_data.get_edited_scene(); + + for (int i = 0; i < editor_data.get_edited_scene_count(); i++) { + if (editor_data.get_scene_path(i) == "") { + continue; + } + + uint64_t last_date = editor_data.get_scene_modified_time(i); + uint64_t date = FileAccess::get_modified_time(editor_data.get_scene_path(i)); + + if (date > last_date) { + String filename = editor_data.get_scene_path(i); + editor_data.set_edited_scene(i); + _remove_edited_scene(false); + + Error err = load_scene(filename, false, false, true, false, true); + if (err != OK) { + ERR_PRINT(vformat("Failed to load scene: %s", filename)); + } + editor_data.move_edited_scene_to_index(i); + } + } + + get_undo_redo()->clear_history(false); + set_current_scene(current_idx); + _update_scene_tabs(); + disk_changed->hide(); +} + +void EditorNode::_reload_project_settings() { + ProjectSettings::get_singleton()->setup(ProjectSettings::get_singleton()->get_resource_path(), String(), true); + settings_changed = true; +} + void EditorNode::_vp_resized() { } @@ -929,7 +1012,7 @@ Error EditorNode::load_resource(const String &p_resource, bool p_ignore_broken_d dependency_errors.clear(); Error err; - RES res = ResourceLoader::load(p_resource, "", false, &err); + RES res = ResourceLoader::load(p_resource, "", ResourceFormatLoader::CACHE_MODE_REUSE, &err); ERR_FAIL_COND_V(!res.is_valid(), ERR_CANT_OPEN); if (!p_ignore_broken_deps && dependency_errors.has(p_resource)) { @@ -1007,13 +1090,23 @@ void EditorNode::save_resource_as(const Ref<Resource> &p_resource, const String file->clear_filters(); List<String> preferred; - for (int i = 0; i < extensions.size(); i++) { - if (p_resource->is_class("Script") && (extensions[i] == "tres" || extensions[i] == "res" || extensions[i] == "xml")) { + for (List<String>::Element *E = extensions.front(); E; E = E->next()) { + if (p_resource->is_class("Script") && (E->get() == "tres" || E->get() == "res")) { //this serves no purpose and confused people continue; } - file->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper()); - preferred.push_back(extensions[i]); + file->add_filter("*." + E->get() + " ; " + E->get().to_upper()); + preferred.push_back(E->get()); + } + // Lowest priority extension + List<String>::Element *res_element = preferred.find("res"); + if (res_element) { + preferred.move_to_back(res_element); + } + // Highest priority extension + List<String>::Element *tres_element = preferred.find("tres"); + if (tres_element) { + preferred.move_to_front(tres_element); } if (p_at_path != String()) { @@ -1513,6 +1606,7 @@ void EditorNode::_save_scene(String p_file, int idx) { } else { editor_data.set_edited_scene_version(0, idx); } + editor_data.set_scene_modified_time(idx, FileAccess::get_modified_time(p_file)); editor_folding.save_scene_folding(scene, p_file); @@ -1716,7 +1810,7 @@ void EditorNode::_dialog_action(String p_file) { ObjectID current = editor_history.get_current(); Object *current_obj = current.is_valid() ? ObjectDB::get_instance(current) : nullptr; ERR_FAIL_COND(!current_obj); - current_obj->_change_notify(); + current_obj->notify_property_list_changed(); } break; case SETTINGS_LAYOUT_SAVE: { if (p_file.is_empty()) { @@ -2178,7 +2272,7 @@ void EditorNode::_run(bool p_current, const String &p_custom) { List<String> breakpoints; editor_data.get_editor_breakpoints(&breakpoints); - args = ProjectSettings::get_singleton()->get("editor/main_run_args"); + args = ProjectSettings::get_singleton()->get("editor/run/main_run_args"); skip_breakpoints = EditorDebuggerNode::get_singleton()->is_skip_breakpoints(); EditorDebuggerNode::get_singleton()->start(); @@ -2304,11 +2398,14 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { _scene_tab_changed(tab_closing); if (unsaved_cache || p_option == FILE_CLOSE_ALL_AND_QUIT || p_option == FILE_CLOSE_ALL_AND_RUN_PROJECT_MANAGER) { - String scene_filename = editor_data.get_edited_scene_root(tab_closing)->get_filename(); - save_confirmation->get_ok_button()->set_text(TTR("Save & Close")); - save_confirmation->set_text(vformat(TTR("Save changes to '%s' before closing?"), scene_filename != "" ? scene_filename : "unsaved scene")); - save_confirmation->popup_centered(); - break; + Node *scene_root = editor_data.get_edited_scene_root(tab_closing); + if (scene_root) { + String scene_filename = scene_root->get_filename(); + save_confirmation->get_ok_button()->set_text(TTR("Save & Close")); + save_confirmation->set_text(vformat(TTR("Save changes to '%s' before closing?"), scene_filename != "" ? scene_filename : "unsaved scene")); + save_confirmation->popup_centered(); + break; + } } } else if (p_option == FILE_CLOSE) { tab_closing = editor_data.get_edited_scene(); @@ -2438,16 +2535,6 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { } break; - case FILE_IMPORT_SUBSCENE: { - if (!editor_data.get_edited_scene_root()) { - show_accept(TTR("This operation can't be done without a selected node."), TTR("OK")); - break; - } - - scene_tree_dock->import_subscene(); - - } break; - case FILE_EXTERNAL_OPEN_SCENE: { if (unsaved_cache && !p_confirmed) { confirmation->get_ok_button()->set_text(TTR("Open")); @@ -2717,7 +2804,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { } break; case SET_VIDEO_DRIVER_SAVE_AND_RESTART: { - ProjectSettings::get_singleton()->set("rendering/quality/driver/driver_name", video_driver_request); + ProjectSettings::get_singleton()->set("rendering/driver/driver_name", video_driver_request); ProjectSettings::get_singleton()->save(); save_all_scenes(); @@ -3328,7 +3415,7 @@ int EditorNode::new_scene() { return idx; } -Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, bool p_set_inherited, bool p_clear_errors, bool p_force_open_imported) { +Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, bool p_set_inherited, bool p_clear_errors, bool p_force_open_imported, bool p_silent_change_tab) { if (!is_inside_tree()) { defer_load_scene = p_scene; return OK; @@ -3368,14 +3455,16 @@ Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, b if (!editor_data.get_edited_scene_root() && editor_data.get_edited_scene_count() == 2) { _remove_edited_scene(); - } else { + } else if (!p_silent_change_tab) { _scene_tab_changed(idx); + } else { + set_current_scene(idx); } dependency_errors.clear(); Error err; - Ref<PackedScene> sdata = ResourceLoader::load(lpath, "", true, &err); + Ref<PackedScene> sdata = ResourceLoader::load(lpath, "", ResourceFormatLoader::CACHE_MODE_REPLACE, &err); if (!sdata.is_valid()) { _dialog_display_load_error(lpath, err); opening_prev = false; @@ -4747,15 +4836,15 @@ void EditorNode::_scene_tab_input(const Ref<InputEvent> &p_input) { if (mb.is_valid()) { if (scene_tabs->get_hovered_tab() >= 0) { - if (mb->get_button_index() == BUTTON_MIDDLE && mb->is_pressed()) { + if (mb->get_button_index() == MOUSE_BUTTON_MIDDLE && mb->is_pressed()) { _scene_tab_closed(scene_tabs->get_hovered_tab()); } } else { - if ((mb->get_button_index() == BUTTON_LEFT && mb->is_doubleclick()) || (mb->get_button_index() == BUTTON_MIDDLE && mb->is_pressed())) { + if ((mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_doubleclick()) || (mb->get_button_index() == MOUSE_BUTTON_MIDDLE && mb->is_pressed())) { _menu_option_confirm(FILE_NEW_SCENE, true); } } - if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) { + if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) { // context menu scene_tabs_context_menu->clear(); scene_tabs_context_menu->set_size(Size2(1, 1)); @@ -5197,6 +5286,8 @@ void EditorNode::_file_access_close_error_notify(const String &p_str) { } void EditorNode::reload_scene(const String &p_path) { + /* + * No longer necesary since scenes now reset and reload their internal resource if needed. //first of all, reload internal textures, materials, meshes, etc. as they might have changed on disk List<Ref<Resource>> cached; @@ -5214,6 +5305,8 @@ void EditorNode::reload_scene(const String &p_path) { to_clear.pop_front(); } + */ + int scene_idx = -1; for (int i = 0; i < editor_data.get_edited_scene_count(); i++) { if (editor_data.get_scene_path(i) == p_path) { @@ -5457,6 +5550,7 @@ void EditorNode::_bind_methods() { ADD_SIGNAL(MethodInfo("request_help_search")); ADD_SIGNAL(MethodInfo("script_add_function_request", PropertyInfo(Variant::OBJECT, "obj"), PropertyInfo(Variant::STRING, "function"), PropertyInfo(Variant::PACKED_STRING_ARRAY, "args"))); ADD_SIGNAL(MethodInfo("resource_saved", PropertyInfo(Variant::OBJECT, "obj"))); + ADD_SIGNAL(MethodInfo("project_settings_changed")); } static Node *_resource_get_edited_scene() { @@ -5476,7 +5570,8 @@ static void _execute_thread(void *p_ud) { eta->exitcode = err; } - eta->done = true; + eta->done.set(); + ; } int EditorNode::execute_and_show_output(const String &p_title, const String &p_path, const List<String> &p_arguments, bool p_close_on_ok, bool p_close_on_errors) { @@ -5490,13 +5585,12 @@ int EditorNode::execute_and_show_output(const String &p_title, const String &p_p eta.path = p_path; eta.args = p_arguments; eta.exitcode = 255; - eta.done = false; int prev_len = 0; eta.execute_output_thread.start(_execute_thread, &eta); - while (!eta.done) { + while (!eta.done.is_set()) { { MutexLock lock(eta.execute_output_mutex); if (prev_len != eta.output.length()) { @@ -5524,6 +5618,10 @@ int EditorNode::execute_and_show_output(const String &p_title, const String &p_p return eta.exitcode; } +void EditorNode::notify_settings_changed() { + settings_changed = true; +} + EditorNode::EditorNode() { Input::get_singleton()->set_use_accumulated_input(true); Resource::_get_local_scene_func = _resource_get_edited_scene; @@ -5594,6 +5692,10 @@ EditorNode::EditorNode() { if (DisplayServer::get_singleton()->screen_get_dpi(screen) >= 192 && DisplayServer::get_singleton()->screen_get_size(screen).y >= 1400) { // hiDPI display. scale = 2.0; + } else if (DisplayServer::get_singleton()->screen_get_size(screen).y >= 1700) { + // Likely a hiDPI display, but we aren't certain due to the returned DPI. + // Use an intermediate scale to handle this situation. + scale = 1.5; } else if (DisplayServer::get_singleton()->screen_get_size(screen).y <= 800) { // Small loDPI display. Use a smaller display scale so that editor elements fit more easily. // Icons won't look great, but this is better than having editor elements overflow from its window. @@ -5752,7 +5854,7 @@ EditorNode::EditorNode() { register_exporters(); - GLOBAL_DEF("editor/main_run_args", ""); + GLOBAL_DEF("editor/run/main_run_args", ""); ClassDB::set_class_enabled("RootMotionView", true); @@ -5777,7 +5879,7 @@ EditorNode::EditorNode() { EDITOR_DEF("interface/inspector/horizontal_vector2_editing", false); EDITOR_DEF("interface/inspector/horizontal_vector_types_editing", true); EDITOR_DEF("interface/inspector/open_resources_in_current_inspector", true); - EDITOR_DEF("interface/inspector/resources_to_open_in_new_inspector", "StandardMaterial3D,ORMMaterial3D,Script,MeshLibrary,TileSet"); + EDITOR_DEF("interface/inspector/resources_to_open_in_new_inspector", "Script,MeshLibrary,TileSet"); EDITOR_DEF("interface/inspector/default_color_picker_mode", 0); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT, "interface/inspector/default_color_picker_mode", PROPERTY_HINT_ENUM, "RGB,HSV,RAW", PROPERTY_USAGE_DEFAULT)); EDITOR_DEF("run/auto_save/save_before_running", true); @@ -6078,6 +6180,9 @@ EditorNode::EditorNode() { project_settings = memnew(ProjectSettingsEditor(&editor_data)); gui_base->add_child(project_settings); + scene_import_settings = memnew(SceneImportSettings); + gui_base->add_child(scene_import_settings); + export_template_manager = memnew(ExportTemplateManager); gui_base->add_child(export_template_manager); @@ -6128,8 +6233,8 @@ EditorNode::EditorNode() { pm_export->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option)); p->add_separator(); - p->add_shortcut(ED_SHORTCUT("editor/undo", TTR("Undo"), KEY_MASK_CMD + KEY_Z), EDIT_UNDO, true); - p->add_shortcut(ED_SHORTCUT("editor/redo", TTR("Redo"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_Z), EDIT_REDO, true); + p->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO, true); + p->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO, true); p->add_separator(); p->add_shortcut(ED_SHORTCUT("editor/reload_saved_scene", TTR("Reload Saved Scene")), EDIT_RELOAD_SAVED_SCENE); @@ -6265,7 +6370,11 @@ EditorNode::EditorNode() { p = help_menu->get_popup(); p->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option)); - p->add_icon_shortcut(gui_base->get_theme_icon("HelpSearch", "EditorIcons"), ED_SHORTCUT("editor/editor_help", TTR("Search"), KEY_MASK_SHIFT | KEY_F1), HELP_SEARCH); +#ifdef OSX_ENABLED + p->add_icon_shortcut(gui_base->get_theme_icon("HelpSearch", "EditorIcons"), ED_SHORTCUT("editor/editor_help", TTR("Search Help"), KEY_MASK_ALT | KEY_SPACE), HELP_SEARCH); +#else + p->add_icon_shortcut(gui_base->get_theme_icon("HelpSearch", "EditorIcons"), ED_SHORTCUT("editor/editor_help", TTR("Search Help"), KEY_F1), HELP_SEARCH); +#endif p->add_separator(); p->add_icon_shortcut(gui_base->get_theme_icon("Instance", "EditorIcons"), ED_SHORTCUT("editor/online_docs", TTR("Online Docs")), HELP_DOCS); p->add_icon_shortcut(gui_base->get_theme_icon("Instance", "EditorIcons"), ED_SHORTCUT("editor/q&a", TTR("Q&A")), HELP_QA); @@ -6370,7 +6479,7 @@ EditorNode::EditorNode() { #warning needs to be reimplemented #endif #if 0 - String video_drivers = ProjectSettings::get_singleton()->get_custom_property_info()["rendering/quality/driver/driver_name"].hint_string; + String video_drivers = ProjectSettings::get_singleton()->get_custom_property_info()["rendering/driver/driver_name"].hint_string; String current_video_driver = OS::get_singleton()->get_video_driver_name(OS::get_singleton()->get_current_video_driver()); video_driver_current = 0; for (int i = 0; i < video_drivers.get_slice_count(","); i++) { @@ -6603,6 +6712,30 @@ EditorNode::EditorNode() { //plugin stuff add_editor_plugin(memnew(DebuggerEditorPlugin(this, debug_menu))); + + disk_changed = memnew(ConfirmationDialog); + { + VBoxContainer *vbc = memnew(VBoxContainer); + disk_changed->add_child(vbc); + + Label *dl = memnew(Label); + dl->set_text(TTR("The following files are newer on disk.\nWhat action should be taken?")); + vbc->add_child(dl); + + disk_changed_list = memnew(Tree); + vbc->add_child(disk_changed_list); + disk_changed_list->set_v_size_flags(Control::SIZE_EXPAND_FILL); + + disk_changed->connect("confirmed", callable_mp(this, &EditorNode::_reload_modified_scenes)); + disk_changed->connect("confirmed", callable_mp(this, &EditorNode::_reload_project_settings)); + disk_changed->get_ok_button()->set_text(TTR("Reload")); + + disk_changed->add_button(TTR("Resave"), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "resave"); + disk_changed->connect("custom_action", callable_mp(this, &EditorNode::_resave_scenes)); + } + + gui_base->add_child(disk_changed); + add_editor_plugin(memnew(AnimationPlayerEditorPlugin(this))); add_editor_plugin(memnew(CanvasItemEditorPlugin(this))); add_editor_plugin(memnew(Node3DEditorPlugin(this))); @@ -6832,14 +6965,12 @@ EditorNode::EditorNode() { ED_SHORTCUT("editor/editor_3d", TTR("Open 3D Editor"), KEY_MASK_ALT | KEY_2); ED_SHORTCUT("editor/editor_script", TTR("Open Script Editor"), KEY_MASK_ALT | KEY_3); ED_SHORTCUT("editor/editor_assetlib", TTR("Open Asset Library"), KEY_MASK_ALT | KEY_4); - ED_SHORTCUT("editor/editor_help", TTR("Search Help"), KEY_MASK_ALT | KEY_SPACE); #else // Use the Ctrl modifier so F2 can be used to rename nodes in the scene tree dock. ED_SHORTCUT("editor/editor_2d", TTR("Open 2D Editor"), KEY_MASK_CTRL | KEY_F1); ED_SHORTCUT("editor/editor_3d", TTR("Open 3D Editor"), KEY_MASK_CTRL | KEY_F2); ED_SHORTCUT("editor/editor_script", TTR("Open Script Editor"), KEY_MASK_CTRL | KEY_F3); ED_SHORTCUT("editor/editor_assetlib", TTR("Open Asset Library"), KEY_MASK_CTRL | KEY_F4); - ED_SHORTCUT("editor/editor_help", TTR("Search Help"), KEY_F1); #endif ED_SHORTCUT("editor/editor_next", TTR("Open the next Editor")); ED_SHORTCUT("editor/editor_prev", TTR("Open the previous Editor")); diff --git a/editor/editor_node.h b/editor/editor_node.h index 356ac0caac..7e16936f5d 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -31,6 +31,7 @@ #ifndef EDITOR_NODE_H #define EDITOR_NODE_H +#include "core/templates/safe_refcount.h" #include "editor/editor_data.h" #include "editor/editor_export.h" #include "editor/editor_folding.h" @@ -87,6 +88,7 @@ class Button; class VSplitContainer; class Window; class SubViewport; +class SceneImportSettings; class EditorNode : public Node { GDCLASS(EditorNode, Node); @@ -111,7 +113,7 @@ public: Thread execute_output_thread; Mutex execute_output_mutex; int exitcode = 0; - volatile bool done = false; + SafeFlag done; }; private: @@ -128,7 +130,6 @@ private: FILE_SAVE_ALL_SCENES, FILE_SAVE_AND_RUN, FILE_SHOW_IN_FILESYSTEM, - FILE_IMPORT_SUBSCENE, FILE_EXPORT_PROJECT, FILE_EXPORT_MESH_LIBRARY, FILE_INSTALL_ANDROID_SOURCE, @@ -312,6 +313,9 @@ private: EditorSettingsDialog *settings_config_dialog; ProjectSettingsEditor *project_settings; + bool settings_changed = true; //make it update settings on first frame + void _update_from_settings(); + PopupMenu *vcs_actions_menu; EditorFileDialog *file; ExportTemplateManager *export_template_manager; @@ -407,6 +411,7 @@ private: EditorResourcePreview *resource_preview; EditorFolding editor_folding; + SceneImportSettings *scene_import_settings; struct BottomPanelItem { String name; Control *control = nullptr; @@ -422,6 +427,9 @@ private: Label *version_label; Button *bottom_panel_raise; + Tree *disk_changed_list; + ConfirmationDialog *disk_changed; + void _bottom_panel_raise_toggled(bool); EditorInterface *editor_interface; @@ -641,6 +649,10 @@ private: static void _resource_loaded(RES p_resource, const String &p_path); void _resources_changed(const Vector<String> &p_resources); + void _scan_external_changes(); + void _reload_modified_scenes(); + void _reload_project_settings(); + void _resave_scenes(String p_str); void _feature_profile_changed(); bool _is_class_editor_disabled_by_feature_profile(const StringName &p_class); @@ -709,8 +721,6 @@ public: void save_resource(const Ref<Resource> &p_resource); void save_resource_as(const Ref<Resource> &p_resource, const String &p_at_path = String()); - void merge_from_scene() { _menu_option_confirm(FILE_IMPORT_SUBSCENE, false); } - void show_about() { _menu_option_confirm(HELP_ABOUT, false); } static bool has_unsaved_changes() { return singleton->unsaved_cache; } @@ -741,7 +751,7 @@ public: void fix_dependencies(const String &p_for_file); void clear_scene() { _cleanup_scene(); } int new_scene(); - Error load_scene(const String &p_scene, bool p_ignore_broken_deps = false, bool p_set_inherited = false, bool p_clear_errors = true, bool p_force_open_imported = false); + Error load_scene(const String &p_scene, bool p_ignore_broken_deps = false, bool p_set_inherited = false, bool p_clear_errors = true, bool p_force_open_imported = false, bool p_silent_change_tab = false); Error load_resource(const String &p_resource, bool p_ignore_broken_deps = false); bool is_scene_open(const String &p_path); @@ -840,6 +850,8 @@ public: void save_scene_list(Vector<String> p_scene_filenames); void restart_editor(); + void notify_settings_changed(); + void dim_editor(bool p_dimming, bool p_force_dim = false); bool is_editor_dimmed() const; diff --git a/editor/editor_plugin.cpp b/editor/editor_plugin.cpp index 840bae35bf..c0cecbc651 100644 --- a/editor/editor_plugin.cpp +++ b/editor/editor_plugin.cpp @@ -756,7 +756,6 @@ int find(const PackedStringArray &a, const String &v) { void EditorPlugin::enable_plugin() { // Called when the plugin gets enabled in project settings, after it's added to the tree. // You can implement it to register autoloads. - if (get_script_instance() && get_script_instance()->has_method("enable_plugin")) { get_script_instance()->call("enable_plugin"); } @@ -819,6 +818,18 @@ void EditorPlugin::remove_debugger_plugin(const Ref<Script> &p_script) { EditorDebuggerNode::get_singleton()->remove_debugger_plugin(p_script); } +void EditorPlugin::_editor_project_settings_changed() { + emit_signal("project_settings_changed"); +} +void EditorPlugin::_notification(int p_what) { + if (p_what == NOTIFICATION_ENTER_TREE) { + EditorNode::get_singleton()->connect("project_settings_changed", callable_mp(this, &EditorPlugin::_editor_project_settings_changed)); + } + if (p_what == NOTIFICATION_EXIT_TREE) { + EditorNode::get_singleton()->disconnect("project_settings_changed", callable_mp(this, &EditorPlugin::_editor_project_settings_changed)); + } +} + 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); @@ -890,6 +901,7 @@ void EditorPlugin::_bind_methods() { ADD_SIGNAL(MethodInfo("scene_closed", PropertyInfo(Variant::STRING, "filepath"))); ADD_SIGNAL(MethodInfo("main_screen_changed", PropertyInfo(Variant::STRING, "screen_name"))); ADD_SIGNAL(MethodInfo("resource_saved", PropertyInfo(Variant::OBJECT, "resource", PROPERTY_HINT_RESOURCE_TYPE, "Resource"))); + ADD_SIGNAL(MethodInfo("project_settings_changed")); BIND_ENUM_CONSTANT(CONTAINER_TOOLBAR); BIND_ENUM_CONSTANT(CONTAINER_SPATIAL_EDITOR_MENU); diff --git a/editor/editor_plugin.h b/editor/editor_plugin.h index 3b741a2f22..ae9fcfb28a 100644 --- a/editor/editor_plugin.h +++ b/editor/editor_plugin.h @@ -130,7 +130,11 @@ class EditorPlugin : public Node { String last_main_screen_name; + void _editor_project_settings_changed(); + protected: + void _notification(int p_what); + static void _bind_methods(); UndoRedo &get_undo_redo() { return *undo_redo; } diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index 4d8a4f46b2..d09e3726fb 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -621,7 +621,7 @@ public: const Ref<InputEventMouseButton> mb = p_ev; - if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && mb->is_pressed() && hovered_index >= 0) { + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed() && hovered_index >= 0) { // Toggle the flag. // We base our choice on the hovered flag, so that it always matches the hovered flag. if (value & (1 << hovered_index)) { @@ -716,12 +716,18 @@ void EditorPropertyLayers::setup(LayerType p_layer_type) { case LAYER_PHYSICS_2D: basename = "layer_names/2d_physics"; break; + case LAYER_NAVIGATION_2D: + basename = "layer_names/2d_navigation"; + break; case LAYER_RENDER_3D: basename = "layer_names/3d_render"; break; case LAYER_PHYSICS_3D: basename = "layer_names/3d_physics"; break; + case LAYER_NAVIGATION_3D: + basename = "layer_names/3d_navigation"; + break; } Vector<String> names; @@ -921,11 +927,11 @@ EditorPropertyFloat::EditorPropertyFloat() { void EditorPropertyEasing::_drag_easing(const Ref<InputEvent> &p_ev) { const Ref<InputEventMouseButton> mb = p_ev; if (mb.is_valid()) { - if (mb->is_doubleclick() && mb->get_button_index() == BUTTON_LEFT) { + if (mb->is_doubleclick() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { _setup_spin(); } - if (mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { preset->set_position(easing_draw->get_screen_transform().xform(mb->get_position())); preset->popup(); @@ -934,7 +940,7 @@ void EditorPropertyEasing::_drag_easing(const Ref<InputEvent> &p_ev) { easing_draw->update(); } - if (mb->get_button_index() == BUTTON_LEFT) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { dragging = mb->is_pressed(); // Update to display the correct dragging color easing_draw->update(); @@ -943,7 +949,7 @@ void EditorPropertyEasing::_drag_easing(const Ref<InputEvent> &p_ev) { const Ref<InputEventMouseMotion> mm = p_ev; - if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT) { + if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { float rel = mm->get_relative().x; if (rel == 0) { return; @@ -1267,16 +1273,20 @@ void EditorPropertyRect2::setup(double p_min, double p_max, double p_step, bool EditorPropertyRect2::EditorPropertyRect2(bool p_force_wide) { bool horizontal = p_force_wide || bool(EDITOR_GET("interface/inspector/horizontal_vector_types_editing")); - + bool grid = false; BoxContainer *bc; if (p_force_wide) { bc = memnew(HBoxContainer); add_child(bc); } else if (horizontal) { - bc = memnew(HBoxContainer); + bc = memnew(VBoxContainer); add_child(bc); set_bottom_editor(bc); + + bc->add_child(memnew(HBoxContainer)); + bc->add_child(memnew(HBoxContainer)); + grid = true; } else { bc = memnew(VBoxContainer); add_child(bc); @@ -1287,7 +1297,13 @@ EditorPropertyRect2::EditorPropertyRect2(bool p_force_wide) { spin[i] = memnew(EditorSpinSlider); spin[i]->set_label(desc[i]); spin[i]->set_flat(true); - bc->add_child(spin[i]); + + if (grid) { + bc->get_child(i / 2)->add_child(spin[i]); + } else { + bc->add_child(spin[i]); + } + add_focusable(spin[i]); spin[i]->connect("value_changed", callable_mp(this, &EditorPropertyRect2::_value_changed), varray(desc[i])); if (horizontal) { @@ -1530,16 +1546,20 @@ void EditorPropertyRect2i::setup(int p_min, int p_max, bool p_no_slider) { EditorPropertyRect2i::EditorPropertyRect2i(bool p_force_wide) { bool horizontal = p_force_wide || bool(EDITOR_GET("interface/inspector/horizontal_vector_types_editing")); - + bool grid = false; BoxContainer *bc; if (p_force_wide) { bc = memnew(HBoxContainer); add_child(bc); } else if (horizontal) { - bc = memnew(HBoxContainer); + bc = memnew(VBoxContainer); add_child(bc); set_bottom_editor(bc); + + bc->add_child(memnew(HBoxContainer)); + bc->add_child(memnew(HBoxContainer)); + grid = true; } else { bc = memnew(VBoxContainer); add_child(bc); @@ -1550,7 +1570,13 @@ EditorPropertyRect2i::EditorPropertyRect2i(bool p_force_wide) { spin[i] = memnew(EditorSpinSlider); spin[i]->set_label(desc[i]); spin[i]->set_flat(true); - bc->add_child(spin[i]); + + if (grid) { + bc->get_child(i / 2)->add_child(spin[i]); + } else { + bc->add_child(spin[i]); + } + add_focusable(spin[i]); spin[i]->connect("value_changed", callable_mp(this, &EditorPropertyRect2i::_value_changed), varray(desc[i])); if (horizontal) { @@ -2788,7 +2814,7 @@ void EditorPropertyResource::_sub_inspector_object_id_selected(int p_id) { void EditorPropertyResource::_button_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { _update_menu_items(); Vector2 pos = get_screen_position() + mb->get_position(); //pos = assign->get_global_transform().xform(pos); @@ -2839,6 +2865,41 @@ void EditorPropertyResource::_fold_other_editors(Object *p_self) { } } +void EditorPropertyResource::_update_property_bg() { + if (!is_inside_tree()) { + return; + } + + updating_theme = true; + if (sub_inspector != nullptr) { + int count_subinspectors = 0; + Node *n = get_parent(); + while (n) { + EditorInspector *ei = Object::cast_to<EditorInspector>(n); + if (ei && ei->is_sub_inspector()) { + count_subinspectors++; + } + n = n->get_parent(); + } + count_subinspectors = MIN(15, count_subinspectors); + + add_theme_color_override("property_color", get_theme_color("sub_inspector_property_color", "Editor")); + add_theme_style_override("bg_selected", get_theme_stylebox("sub_inspector_property_bg_selected" + itos(count_subinspectors), "Editor")); + add_theme_style_override("bg", get_theme_stylebox("sub_inspector_property_bg" + itos(count_subinspectors), "Editor")); + + add_theme_constant_override("font_offset", get_theme_constant("sub_inspector_font_offset", "Editor")); + add_theme_constant_override("vseparation", 0); + } else { + add_theme_color_override("property_color", get_theme_color("property_color", "EditorProperty")); + add_theme_style_override("bg_selected", get_theme_stylebox("bg_selected", "EditorProperty")); + add_theme_style_override("bg", get_theme_stylebox("bg", "EditorProperty")); + add_theme_constant_override("vseparation", get_theme_constant("vseparation", "EditorProperty")); + add_theme_constant_override("font_offset", get_theme_constant("font_offset", "EditorProperty")); + } + + updating_theme = false; + update(); +} void EditorPropertyResource::update_property() { RES res = get_edited_object()->get(get_edited_property()); @@ -2854,7 +2915,7 @@ void EditorPropertyResource::update_property() { sub_inspector->set_use_doc_hints(true); sub_inspector->set_sub_inspector(true); - sub_inspector->set_enable_capitalize_paths(true); + sub_inspector->set_enable_capitalize_paths(bool(EDITOR_GET("interface/inspector/capitalize_properties"))); sub_inspector->connect("property_keyed", callable_mp(this, &EditorPropertyResource::_sub_inspector_property_keyed)); sub_inspector->connect("resource_selected", callable_mp(this, &EditorPropertyResource::_sub_inspector_resource_selected)); @@ -2887,13 +2948,14 @@ void EditorPropertyResource::update_property() { } opened_editor = true; } + + _update_property_bg(); } if (res.ptr() != sub_inspector->get_edited_object()) { sub_inspector->edit(res.ptr()); } - sub_inspector->refresh(); } else { if (sub_inspector) { set_bottom_editor(nullptr); @@ -2904,6 +2966,7 @@ void EditorPropertyResource::update_property() { EditorNode::get_singleton()->hide_top_editors(); opened_editor = false; } + _update_property_bg(); } } } @@ -2957,8 +3020,12 @@ void EditorPropertyResource::setup(const String &p_base_type) { void EditorPropertyResource::_notification(int p_what) { if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { + if (updating_theme) { + return; + } Ref<Texture2D> t = get_theme_icon("select_arrow", "Tree"); edit->set_icon(t); + _update_property_bg(); } if (p_what == NOTIFICATION_DRAG_BEGIN) { @@ -3239,7 +3306,12 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ editor->setup(options); add_property_editor(p_path, editor); - } else if (p_hint == PROPERTY_HINT_LAYERS_2D_PHYSICS || p_hint == PROPERTY_HINT_LAYERS_2D_RENDER || p_hint == PROPERTY_HINT_LAYERS_3D_PHYSICS || p_hint == PROPERTY_HINT_LAYERS_3D_RENDER) { + } else if (p_hint == PROPERTY_HINT_LAYERS_2D_PHYSICS || + p_hint == PROPERTY_HINT_LAYERS_2D_RENDER || + p_hint == PROPERTY_HINT_LAYERS_2D_NAVIGATION || + p_hint == PROPERTY_HINT_LAYERS_3D_PHYSICS || + p_hint == PROPERTY_HINT_LAYERS_3D_RENDER || + p_hint == PROPERTY_HINT_LAYERS_3D_NAVIGATION) { EditorPropertyLayers::LayerType lt = EditorPropertyLayers::LAYER_RENDER_2D; switch (p_hint) { case PROPERTY_HINT_LAYERS_2D_RENDER: @@ -3248,12 +3320,18 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ case PROPERTY_HINT_LAYERS_2D_PHYSICS: lt = EditorPropertyLayers::LAYER_PHYSICS_2D; break; + case PROPERTY_HINT_LAYERS_2D_NAVIGATION: + lt = EditorPropertyLayers::LAYER_NAVIGATION_2D; + break; case PROPERTY_HINT_LAYERS_3D_RENDER: lt = EditorPropertyLayers::LAYER_RENDER_3D; break; case PROPERTY_HINT_LAYERS_3D_PHYSICS: lt = EditorPropertyLayers::LAYER_PHYSICS_3D; break; + case PROPERTY_HINT_LAYERS_3D_NAVIGATION: + lt = EditorPropertyLayers::LAYER_NAVIGATION_3D; + break; default: { } //compiler could be smarter here and realize this can't happen } diff --git a/editor/editor_properties.h b/editor/editor_properties.h index 4775259111..07a1e72319 100644 --- a/editor/editor_properties.h +++ b/editor/editor_properties.h @@ -239,8 +239,10 @@ public: enum LayerType { LAYER_PHYSICS_2D, LAYER_RENDER_2D, + LAYER_NAVIGATION_2D, LAYER_PHYSICS_3D, LAYER_RENDER_3D, + LAYER_NAVIGATION_3D, }; private: @@ -654,6 +656,9 @@ class EditorPropertyResource : public EditorProperty { bool opened_editor; + bool updating_theme = false; + void _update_property_bg(); + protected: static void _bind_methods(); void _notification(int p_what); diff --git a/editor/editor_properties_array_dict.cpp b/editor/editor_properties_array_dict.cpp index a798344973..de688f2709 100644 --- a/editor/editor_properties_array_dict.cpp +++ b/editor/editor_properties_array_dict.cpp @@ -573,8 +573,7 @@ void EditorPropertyArray::_bind_methods() { EditorPropertyArray::EditorPropertyArray() { object.instance(); - page_idx = 0; - page_len = 10; + page_len = int(EDITOR_GET("interface/inspector/max_array_dictionary_items_per_page")); edit = memnew(Button); edit->set_flat(true); edit->set_h_size_flags(SIZE_EXPAND_FILL); @@ -1069,8 +1068,7 @@ void EditorPropertyDictionary::_bind_methods() { EditorPropertyDictionary::EditorPropertyDictionary() { object.instance(); - page_idx = 0; - page_len = 10; + page_len = int(EDITOR_GET("interface/inspector/max_array_dictionary_items_per_page")); edit = memnew(Button); edit->set_flat(true); edit->set_h_size_flags(SIZE_EXPAND_FILL); diff --git a/editor/editor_properties_array_dict.h b/editor/editor_properties_array_dict.h index 0359f3d9bc..fa5adc788d 100644 --- a/editor/editor_properties_array_dict.h +++ b/editor/editor_properties_array_dict.h @@ -84,8 +84,8 @@ class EditorPropertyArray : public EditorProperty { bool dropping; Ref<EditorPropertyArrayObject> object; - int page_len; - int page_idx; + int page_len = 20; + int page_idx = 0; int changing_type_idx; Button *edit; VBoxContainer *vbox; @@ -129,8 +129,8 @@ class EditorPropertyDictionary : public EditorProperty { bool updating; Ref<EditorPropertyDictionaryObject> object; - int page_len; - int page_idx; + int page_len = 20; + int page_idx = 0; int changing_type_idx; Button *edit; VBoxContainer *vbox; diff --git a/editor/editor_resource_preview.cpp b/editor/editor_resource_preview.cpp index 8056846f52..77288be614 100644 --- a/editor/editor_resource_preview.cpp +++ b/editor/editor_resource_preview.cpp @@ -206,8 +206,8 @@ void EditorResourcePreview::_generate_preview(Ref<ImageTexture> &r_texture, Ref< } void EditorResourcePreview::_thread() { - exited = false; - while (!exit) { + exited.clear(); + while (!exit.is_set()) { preview_sem.wait(); preview_mutex.lock(); @@ -326,7 +326,7 @@ void EditorResourcePreview::_thread() { preview_mutex.unlock(); } } - exited = true; + exited.set(); } void EditorResourcePreview::queue_edited_resource_preview(const Ref<Resource> &p_res, Object *p_receiver, const StringName &p_receiver_func, const Variant &p_userdata) { @@ -430,9 +430,9 @@ void EditorResourcePreview::start() { void EditorResourcePreview::stop() { if (thread.is_started()) { - exit = true; + exit.set(); preview_sem.post(); - while (!exited) { + while (!exited.is_set()) { OS::get_singleton()->delay_usec(10000); RenderingServer::get_singleton()->sync(); //sync pending stuff, as thread may be blocked on visual server } @@ -443,8 +443,6 @@ void EditorResourcePreview::stop() { EditorResourcePreview::EditorResourcePreview() { singleton = this; order = 0; - exit = false; - exited = false; } EditorResourcePreview::~EditorResourcePreview() { diff --git a/editor/editor_resource_preview.h b/editor/editor_resource_preview.h index 99c48967d8..c4e796dcf1 100644 --- a/editor/editor_resource_preview.h +++ b/editor/editor_resource_preview.h @@ -33,6 +33,7 @@ #include "core/os/semaphore.h" #include "core/os/thread.h" +#include "core/templates/safe_refcount.h" #include "scene/main/node.h" #include "scene/resources/texture.h" @@ -71,8 +72,8 @@ class EditorResourcePreview : public Node { Mutex preview_mutex; Semaphore preview_sem; Thread thread; - volatile bool exit; - volatile bool exited; + SafeFlag exit; + SafeFlag exited; struct Item { Ref<Texture2D> preview; diff --git a/editor/editor_sectioned_inspector.cpp b/editor/editor_sectioned_inspector.cpp index a2627f51ac..f81c87be9e 100644 --- a/editor/editor_sectioned_inspector.cpp +++ b/editor/editor_sectioned_inspector.cpp @@ -116,12 +116,12 @@ public: void set_section(const String &p_section, bool p_allow_sub) { section = p_section; allow_sub = p_allow_sub; - _change_notify(); + notify_property_list_changed(); } void set_edited(Object *p_edited) { edited = p_edited; - _change_notify(); + notify_property_list_changed(); } }; @@ -226,7 +226,7 @@ void SectionedInspector::update_category_list() { if (pi.usage & PROPERTY_USAGE_CATEGORY) { continue; - } else if (!(pi.usage & PROPERTY_USAGE_EDITOR)) { + } else if (!(pi.usage & PROPERTY_USAGE_EDITOR) || (restrict_to_basic && !(pi.usage & PROPERTY_USAGE_EDITOR_BASIC_SETTING))) { continue; } @@ -294,6 +294,12 @@ EditorInspector *SectionedInspector::get_inspector() { return inspector; } +void SectionedInspector::set_restrict_to_basic_settings(bool p_restrict) { + restrict_to_basic = p_restrict; + update_category_list(); + inspector->set_restrict_to_basic_settings(p_restrict); +} + SectionedInspector::SectionedInspector() : sections(memnew(Tree)), filter(memnew(SectionedInspectorFilter)), diff --git a/editor/editor_sectioned_inspector.h b/editor/editor_sectioned_inspector.h index 55fb94fecc..1068a4f932 100644 --- a/editor/editor_sectioned_inspector.h +++ b/editor/editor_sectioned_inspector.h @@ -51,6 +51,8 @@ class SectionedInspector : public HSplitContainer { String selected_category; + bool restrict_to_basic = false; + static void _bind_methods(); void _section_selected(); @@ -65,6 +67,7 @@ public: void set_current_section(const String &p_section); String get_current_section() const; + void set_restrict_to_basic_settings(bool p_restrict); void update_category_list(); SectionedInspector(); diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index 9908f5727e..4ddae7c062 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -31,6 +31,7 @@ #include "editor_settings.h" #include "core/config/project_settings.h" +#include "core/input/input_map.h" #include "core/io/certs_compressed.gen.h" #include "core/io/compression.h" #include "core/io/config_file.h" @@ -70,7 +71,7 @@ bool EditorSettings::_set(const StringName &p_name, const Variant &p_value) { bool EditorSettings::_set_only(const StringName &p_name, const Variant &p_value) { _THREAD_SAFE_METHOD_ - if (p_name.operator String() == "shortcuts") { + if (p_name == "shortcuts") { Array arr = p_value; ERR_FAIL_COND_V(arr.size() && arr.size() & 1, true); for (int i = 0; i < arr.size(); i += 2) { @@ -84,6 +85,24 @@ bool EditorSettings::_set_only(const StringName &p_name, const Variant &p_value) } return false; + } else if (p_name == "builtin_action_overrides") { + Array actions_arr = p_value; + for (int i = 0; i < actions_arr.size(); i++) { + Dictionary action_dict = actions_arr[i]; + + String name = action_dict["name"]; + Array events = action_dict["events"]; + + InputMap *im = InputMap::get_singleton(); + im->action_erase_events(name); + + builtin_action_overrides[name].clear(); + for (int ev_idx = 0; ev_idx < events.size(); ev_idx++) { + im->action_add_event(name, events[ev_idx]); + builtin_action_overrides[name].push_back(events[ev_idx]); + } + } + return false; } bool changed = false; @@ -118,11 +137,16 @@ bool EditorSettings::_set_only(const StringName &p_name, const Variant &p_value) bool EditorSettings::_get(const StringName &p_name, Variant &r_ret) const { _THREAD_SAFE_METHOD_ - if (p_name.operator String() == "shortcuts") { + if (p_name == "shortcuts") { Array arr; for (const Map<String, Ref<Shortcut>>::Element *E = shortcuts.front(); E; E = E->next()) { Ref<Shortcut> sc = E->get(); + if (builtin_action_overrides.has(E->key())) { + // This shortcut was auto-generated from built in actions: don't save. + continue; + } + if (optimize_save) { if (!sc->has_meta("original")) { continue; //this came from settings but is not any longer used @@ -139,6 +163,27 @@ bool EditorSettings::_get(const StringName &p_name, Variant &r_ret) const { } r_ret = arr; return true; + } else if (p_name == "builtin_action_overrides") { + Array actions_arr; + for (Map<String, List<Ref<InputEvent>>>::Element *E = builtin_action_overrides.front(); E; E = E->next()) { + List<Ref<InputEvent>> events = E->get(); + + // TODO: skip actions which are the same as the builtin. + Dictionary action_dict; + action_dict["name"] = E->key(); + + Array events_arr; + for (List<Ref<InputEvent>>::Element *I = events.front(); I; I = I->next()) { + events_arr.push_back(I->get()); + } + + action_dict["events"] = events_arr; + + actions_arr.push_back(action_dict); + } + + r_ret = actions_arr; + return true; } const VariantContainer *v = props.getptr(p_name); @@ -220,6 +265,7 @@ void EditorSettings::_get_property_list(List<PropertyInfo> *p_list) const { } p_list->push_back(PropertyInfo(Variant::ARRAY, "shortcuts", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL)); //do not edit + p_list->push_back(PropertyInfo(Variant::ARRAY, "builtin_action_overrides", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL)); } void EditorSettings::_add_property_info_bind(const Dictionary &p_info) { @@ -337,6 +383,10 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { if (DisplayServer::get_singleton()->screen_get_dpi(screen) >= 192 && DisplayServer::get_singleton()->screen_get_size(screen).y >= 1400) { // hiDPI display. scale = 2.0; + } else if (DisplayServer::get_singleton()->screen_get_size(screen).y >= 1700) { + // Likely a hiDPI display, but we aren't certain due to the returned DPI. + // Use an intermediate scale to handle this situation. + scale = 1.5; } else if (DisplayServer::get_singleton()->screen_get_size(screen).y <= 800) { // Small loDPI display. Use a smaller display scale so that editor elements fit more easily. // Icons won't look great, but this is better than having editor elements overflow from its window. @@ -381,6 +431,10 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { _initial_set("interface/editor/hide_console_window", false); _initial_set("interface/editor/save_each_scene_on_quit", true); // Regression + // Inspector + _initial_set("interface/inspector/max_array_dictionary_items_per_page", 20); + hints["interface/inspector/max_array_dictionary_items_per_page"] = PropertyInfo(Variant::INT, "interface/inspector/max_array_dictionary_items_per_page", PROPERTY_HINT_RANGE, "10,100,1", PROPERTY_USAGE_DEFAULT); + // Theme _initial_set("interface/theme/preset", "Default"); hints["interface/theme/preset"] = PropertyInfo(Variant::STRING, "interface/theme/preset", PROPERTY_HINT_ENUM, "Default,Alien,Arc,Godot 2,Grey,Light,Solarized (Dark),Solarized (Light),Custom", PROPERTY_USAGE_DEFAULT); @@ -392,6 +446,8 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { hints["interface/theme/accent_color"] = PropertyInfo(Variant::COLOR, "interface/theme/accent_color", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT); _initial_set("interface/theme/contrast", 0.25); hints["interface/theme/contrast"] = PropertyInfo(Variant::FLOAT, "interface/theme/contrast", PROPERTY_HINT_RANGE, "0.01, 1, 0.01"); + _initial_set("interface/theme/icon_saturation", 1.0); + hints["interface/theme/icon_saturation"] = PropertyInfo(Variant::FLOAT, "interface/theme/icon_saturation", PROPERTY_HINT_RANGE, "0,2,0.01", PROPERTY_USAGE_DEFAULT); _initial_set("interface/theme/relationship_line_opacity", 0.1); hints["interface/theme/relationship_line_opacity"] = PropertyInfo(Variant::FLOAT, "interface/theme/relationship_line_opacity", PROPERTY_HINT_RANGE, "0.00, 1, 0.01"); _initial_set("interface/theme/highlight_tabs", false); @@ -404,7 +460,6 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { hints["interface/theme/custom_theme"] = PropertyInfo(Variant::STRING, "interface/theme/custom_theme", PROPERTY_HINT_GLOBAL_FILE, "*.res,*.tres,*.theme", PROPERTY_USAGE_DEFAULT); // Scene tabs - _initial_set("interface/scene_tabs/show_extension", false); _initial_set("interface/scene_tabs/show_thumbnail_on_hover", true); _initial_set("interface/scene_tabs/resize_if_many_tabs", true); _initial_set("interface/scene_tabs/minimum_width", 50); @@ -441,7 +496,9 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { _initial_set("docks/filesystem/always_show_folders", true); // Property editor - _initial_set("docks/property_editor/auto_refresh_interval", 0.3); + _initial_set("docks/property_editor/auto_refresh_interval", 0.2); //update 5 times per second by default + _initial_set("docks/property_editor/subresource_hue_tint", 0.75); + hints["docks/property_editor/subresource_hue_tint"] = PropertyInfo(Variant::FLOAT, "docks/property_editor/subresource_hue_tint", PROPERTY_HINT_RANGE, "0,1,0.01", PROPERTY_USAGE_DEFAULT); /* Text editor */ @@ -562,8 +619,8 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { // is increased significantly more than it really should need to be. hints["editors/3d/grid_division_level_max"] = PropertyInfo(Variant::INT, "editors/3d/grid_division_level_max", PROPERTY_HINT_RANGE, "-1,3,1", PROPERTY_USAGE_DEFAULT); - // Default smallest grid size is 1cm, 10^-2. - _initial_set("editors/3d/grid_division_level_min", -2); + // Default smallest grid size is 1m, 10^0. + _initial_set("editors/3d/grid_division_level_min", 0); // Lower values produce graphical artifacts regardless of view clipping planes, so limit to -2 as a lower bound. hints["editors/3d/grid_division_level_min"] = PropertyInfo(Variant::INT, "editors/3d/grid_division_level_min", PROPERTY_HINT_RANGE, "-2,2,1", PROPERTY_USAGE_DEFAULT); @@ -1277,7 +1334,7 @@ String EditorSettings::get_script_templates_dir() const { } String EditorSettings::get_project_script_templates_dir() const { - return ProjectSettings::get_singleton()->get("editor/script_templates_search_path"); + return ProjectSettings::get_singleton()->get("editor/script/templates_search_path"); } // Cache directory @@ -1531,12 +1588,39 @@ bool EditorSettings::is_shortcut(const String &p_name, const Ref<InputEvent> &p_ } Ref<Shortcut> EditorSettings::get_shortcut(const String &p_name) const { - const Map<String, Ref<Shortcut>>::Element *E = shortcuts.find(p_name); - if (!E) { - return Ref<Shortcut>(); + const Map<String, Ref<Shortcut>>::Element *SC = shortcuts.find(p_name); + if (SC) { + return SC->get(); } - return E->get(); + // If no shortcut with the provided name is found in the list, check the built-in shortcuts. + // Use the first item in the action list for the shortcut event, since a shortcut can only have 1 linked event. + + Ref<Shortcut> sc; + const Map<String, List<Ref<InputEvent>>>::Element *builtin_override = builtin_action_overrides.find(p_name); + if (builtin_override) { + sc.instance(); + sc->set_shortcut(builtin_override->get().front()->get()); + sc->set_name(InputMap::get_singleton()->get_builtin_display_name(p_name)); + } + + // If there was no override, check the default builtins to see if it has an InputEvent for the provided name. + if (sc.is_null()) { + const OrderedHashMap<String, List<Ref<InputEvent>>>::ConstElement builtin_default = InputMap::get_singleton()->get_builtins().find(p_name); + if (builtin_default) { + sc.instance(); + sc->set_shortcut(builtin_default.get().front()->get()); + sc->set_name(InputMap::get_singleton()->get_builtin_display_name(p_name)); + } + } + + if (sc.is_valid()) { + // Add the shortcut to the list. + shortcuts[p_name] = sc; + return sc; + } + + return Ref<Shortcut>(); } void EditorSettings::get_shortcut_list(List<String> *r_shortcuts) { @@ -1602,6 +1686,66 @@ Ref<Shortcut> ED_SHORTCUT(const String &p_path, const String &p_name, uint32_t p return sc; } +void EditorSettings::set_builtin_action_override(const String &p_name, const Array &p_events) { + List<Ref<InputEvent>> event_list; + + // Override the whole list, since events may have their order changed or be added, removed or edited. + InputMap::get_singleton()->action_erase_events(p_name); + for (int i = 0; i < p_events.size(); i++) { + event_list.push_back(p_events[i]); + InputMap::get_singleton()->action_add_event(p_name, p_events[i]); + } + + // Check if the provided event array is same as built-in. If it is, it does not need to be added to the overrides. + // Note that event order must also be the same. + bool same_as_builtin = true; + OrderedHashMap<String, List<Ref<InputEvent>>>::ConstElement builtin_default = InputMap::get_singleton()->get_builtins().find(p_name); + if (builtin_default) { + List<Ref<InputEvent>> builtin_events = builtin_default.get(); + + if (p_events.size() == builtin_events.size()) { + int event_idx = 0; + + // Check equality of each event. + for (List<Ref<InputEvent>>::Element *E = builtin_events.front(); E; E = E->next()) { + if (!E->get()->shortcut_match(p_events[event_idx])) { + same_as_builtin = false; + break; + } + event_idx++; + } + } else { + same_as_builtin = false; + } + } + + if (same_as_builtin && builtin_action_overrides.has(p_name)) { + builtin_action_overrides.erase(p_name); + } else { + builtin_action_overrides[p_name] = event_list; + } + + // Update the shortcut (if it is used somewhere in the editor) to be the first event of the new list. + if (shortcuts.has(p_name)) { + shortcuts[p_name]->set_shortcut(event_list.front()->get()); + } +} + +const Array EditorSettings::get_builtin_action_overrides(const String &p_name) const { + const Map<String, List<Ref<InputEvent>>>::Element *AO = builtin_action_overrides.find(p_name); + if (AO) { + Array event_array; + + List<Ref<InputEvent>> events_list = AO->get(); + for (List<Ref<InputEvent>>::Element *E = events_list.front(); E; E = E->next()) { + event_array.push_back(E->get()); + } + return event_array; + } + + return Array(); +} + void EditorSettings::notify_changes() { _THREAD_SAFE_METHOD_ @@ -1640,6 +1784,8 @@ void EditorSettings::_bind_methods() { ClassDB::bind_method(D_METHOD("set_recent_dirs", "dirs"), &EditorSettings::set_recent_dirs); ClassDB::bind_method(D_METHOD("get_recent_dirs"), &EditorSettings::get_recent_dirs); + ClassDB::bind_method(D_METHOD("set_builtin_action_override", "name", "actions_list"), &EditorSettings::set_builtin_action_override); + ADD_SIGNAL(MethodInfo("settings_changed")); BIND_CONSTANT(NOTIFICATION_EDITOR_SETTINGS_CHANGED); diff --git a/editor/editor_settings.h b/editor/editor_settings.h index 616a938a86..e5f8527faf 100644 --- a/editor/editor_settings.h +++ b/editor/editor_settings.h @@ -84,7 +84,8 @@ private: int last_order; Ref<Resource> clipboard; - Map<String, Ref<Shortcut>> shortcuts; + mutable Map<String, Ref<Shortcut>> shortcuts; + Map<String, List<Ref<InputEvent>>> builtin_action_overrides; String resource_path; String settings_dir; @@ -186,6 +187,9 @@ public: Ref<Shortcut> get_shortcut(const String &p_name) const; void get_shortcut_list(List<String> *r_shortcuts); + void set_builtin_action_override(const String &p_name, const Array &p_events); + const Array get_builtin_action_overrides(const String &p_name) const; + void notify_changes(); EditorSettings(); diff --git a/editor/editor_spin_slider.cpp b/editor/editor_spin_slider.cpp index 618d953c56..c09d78826c 100644 --- a/editor/editor_spin_slider.cpp +++ b/editor/editor_spin_slider.cpp @@ -53,7 +53,7 @@ void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->get_button_index() == BUTTON_LEFT) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->is_pressed()) { if (updown_offset != -1 && mb->get_position().x > updown_offset) { //there is an updown, so use it. @@ -84,7 +84,7 @@ void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) { grabbing_spinner_attempt = false; } } - } else if (mb->get_button_index() == BUTTON_WHEEL_UP || mb->get_button_index() == BUTTON_WHEEL_DOWN) { + } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP || mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { if (grabber->is_visible()) { call_deferred("update"); } @@ -146,17 +146,17 @@ void EditorSpinSlider::_grabber_gui_input(const Ref<InputEvent> &p_event) { if (grabbing_grabber) { if (mb.is_valid()) { - if (mb->get_button_index() == BUTTON_WHEEL_UP) { + if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { set_value(get_value() + get_step()); mousewheel_over_grabber = true; - } else if (mb->get_button_index() == BUTTON_WHEEL_DOWN) { + } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { set_value(get_value() - get_step()); mousewheel_over_grabber = true; } } } - if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->is_pressed()) { grabbing_grabber = true; if (!mousewheel_over_grabber) { @@ -175,7 +175,9 @@ void EditorSpinSlider::_grabber_gui_input(const Ref<InputEvent> &p_event) { return; } - float grabbing_ofs = (grabber->get_transform().xform(mm->get_position()).x - grabbing_from) / float(grabber_range); + float scale_x = get_global_transform_with_canvas().get_scale().x; + ERR_FAIL_COND(Math::is_zero_approx(scale_x)); + float grabbing_ofs = (grabber->get_transform().xform(mm->get_position()).x - grabbing_from) / float(grabber_range) / scale_x; set_as_ratio(grabbing_ratio + grabbing_ofs); update(); } @@ -300,8 +302,10 @@ void EditorSpinSlider::_notification(int p_what) { grabber->set_texture(grabber_tex); } + Vector2 scale = get_global_transform_with_canvas().get_scale(); + grabber->set_scale(scale); grabber->set_size(Size2(0, 0)); - grabber->set_position(get_global_position() + grabber_rect.position + grabber_rect.size * 0.5 - grabber->get_size() * 0.5); + grabber->set_position(get_global_position() + (grabber_rect.position + grabber_rect.size * 0.5 - grabber->get_size() * 0.5) * scale); if (mousewheel_over_grabber) { Input::get_singleton()->warp_mouse_position(grabber->get_position() + grabber_rect.size); diff --git a/editor/editor_sub_scene.cpp b/editor/editor_sub_scene.cpp deleted file mode 100644 index e319fbff52..0000000000 --- a/editor/editor_sub_scene.cpp +++ /dev/null @@ -1,265 +0,0 @@ -/*************************************************************************/ -/* editor_sub_scene.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2021 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_sub_scene.h" - -#include "editor/editor_node.h" -#include "scene/gui/margin_container.h" -#include "scene/resources/packed_scene.h" - -void EditorSubScene::_path_selected(const String &p_path) { - path->set_text(p_path); - _path_changed(p_path); -} - -void EditorSubScene::_path_changed(const String &p_path) { - tree->clear(); - - if (scene) { - memdelete(scene); - scene = nullptr; - } - - if (p_path == "") { - return; - } - - Ref<PackedScene> ps = ResourceLoader::load(p_path, "PackedScene"); - - if (ps.is_null()) { - return; - } - - scene = ps->instance(); - if (!scene) { - return; - } - - _fill_tree(scene, nullptr); -} - -void EditorSubScene::_path_browse() { - file_dialog->popup_file_dialog(); -} - -void EditorSubScene::_notification(int p_what) { - if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - if (is_visible() && scene == nullptr) { - _path_browse(); - } - } -} - -void EditorSubScene::_fill_tree(Node *p_node, TreeItem *p_parent) { - TreeItem *it = tree->create_item(p_parent); - it->set_metadata(0, p_node); - it->set_text(0, p_node->get_name()); - it->set_editable(0, false); - it->set_selectable(0, true); - it->set_icon(0, EditorNode::get_singleton()->get_object_icon(p_node, "Node")); - - for (int i = 0; i < p_node->get_child_count(); i++) { - Node *c = p_node->get_child(i); - if (c->get_owner() != scene) { - continue; - } - _fill_tree(c, it); - } -} - -void EditorSubScene::_selected_changed() { - TreeItem *item = tree->get_selected(); - ERR_FAIL_COND(!item); - Node *n = item->get_metadata(0); - - if (!n || !selection.find(n)) { - selection.clear(); - is_root = false; - } -} - -void EditorSubScene::_item_multi_selected(Object *p_object, int p_cell, bool p_selected) { - if (!is_root) { - TreeItem *item = Object::cast_to<TreeItem>(p_object); - ERR_FAIL_COND(!item); - - Node *n = item->get_metadata(0); - - if (!n) { - return; - } - if (p_selected) { - if (n == scene) { - is_root = true; - selection.clear(); - } - selection.push_back(n); - } else { - List<Node *>::Element *E = selection.find(n); - - if (E) { - selection.erase(E); - } - } - } -} - -void EditorSubScene::_item_activated() { - _ok_pressed(); // From AcceptDialog. -} - -void EditorSubScene::_remove_selection_child(Node *p_node) { - if (p_node->get_child_count() > 0) { - for (int i = 0; i < p_node->get_child_count(); i++) { - Node *c = p_node->get_child(i); - List<Node *>::Element *E = selection.find(c); - if (E) { - selection.move_to_back(E); - selection.pop_back(); - } - if (c->get_child_count() > 0) { - _remove_selection_child(c); - } - } - } -} - -void EditorSubScene::ok_pressed() { - if (selection.size() <= 0) { - return; - } - for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { - Node *c = E->get(); - _remove_selection_child(c); - } - emit_signal("subscene_selected"); - hide(); - clear(); -} - -void EditorSubScene::_reown(Node *p_node, List<Node *> *p_to_reown) { - if (p_node == scene) { - scene->set_filename(""); - p_to_reown->push_back(p_node); - } else if (p_node->get_owner() == scene) { - p_to_reown->push_back(p_node); - } - - for (int i = 0; i < p_node->get_child_count(); i++) { - Node *c = p_node->get_child(i); - _reown(c, p_to_reown); - } -} - -void EditorSubScene::move(Node *p_new_parent, Node *p_new_owner) { - if (!scene) { - return; - } - - if (selection.size() <= 0) { - return; - } - - for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { - Node *selnode = E->get(); - if (!selnode) { - return; - } - List<Node *> to_reown; - _reown(selnode, &to_reown); - if (selnode != scene) { - selnode->get_parent()->remove_child(selnode); - } - - p_new_parent->add_child(selnode); - for (List<Node *>::Element *F = to_reown.front(); F; F = F->next()) { - F->get()->set_owner(p_new_owner); - } - } - if (!is_root) { - memdelete(scene); - } - scene = nullptr; - //return selnode; -} - -void EditorSubScene::clear() { - path->set_text(""); - _path_changed(""); -} - -void EditorSubScene::_bind_methods() { - ADD_SIGNAL(MethodInfo("subscene_selected")); -} - -EditorSubScene::EditorSubScene() { - scene = nullptr; - is_root = false; - - set_title(TTR("Select Node(s) to Import")); - set_hide_on_ok(false); - - VBoxContainer *vb = memnew(VBoxContainer); - add_child(vb); - //set_child_rect(vb); - - HBoxContainer *hb = memnew(HBoxContainer); - path = memnew(LineEdit); - path->connect("text_entered", callable_mp(this, &EditorSubScene::_path_changed)); - hb->add_child(path); - path->set_h_size_flags(Control::SIZE_EXPAND_FILL); - Button *b = memnew(Button); - b->set_text(TTR("Browse")); - hb->add_child(b); - b->connect("pressed", callable_mp(this, &EditorSubScene::_path_browse)); - vb->add_margin_child(TTR("Scene Path:"), hb); - - tree = memnew(Tree); - tree->set_v_size_flags(Control::SIZE_EXPAND_FILL); - vb->add_margin_child(TTR("Import From Node:"), tree, true); - tree->set_select_mode(Tree::SELECT_MULTI); - tree->connect("multi_selected", callable_mp(this, &EditorSubScene::_item_multi_selected)); - //tree->connect("nothing_selected", this, "_deselect_items"); - tree->connect("cell_selected", callable_mp(this, &EditorSubScene::_selected_changed)); - - tree->connect("item_activated", callable_mp(this, &EditorSubScene::_item_activated), make_binds(), CONNECT_DEFERRED); - - file_dialog = memnew(EditorFileDialog); - List<String> extensions; - ResourceLoader::get_recognized_extensions_for_type("PackedScene", &extensions); - - for (List<String>::Element *E = extensions.front(); E; E = E->next()) { - file_dialog->add_filter("*." + E->get()); - } - - file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE); - add_child(file_dialog); - file_dialog->connect("file_selected", callable_mp(this, &EditorSubScene::_path_selected)); -} diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp index 8f877a4762..9aad1aa8d9 100644 --- a/editor/editor_themes.cpp +++ b/editor/editor_themes.cpp @@ -106,7 +106,7 @@ static Ref<Texture2D> flip_icon(Ref<Texture2D> p_texture, bool p_flip_y = 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) { +static Ref<ImageTexture> editor_generate_icon(int p_index, bool p_convert_color, float p_scale = EDSCALE, float p_saturation = 1.0) { Ref<ImageTexture> icon = memnew(ImageTexture); Ref<Image> img = memnew(Image); @@ -116,6 +116,9 @@ static Ref<ImageTexture> editor_generate_icon(int p_index, bool p_convert_color, const bool upsample = !Math::is_equal_approx(Math::round(p_scale), p_scale); ImageLoaderSVG::create_image_from_string(img, editor_icons_sources[p_index], p_scale, upsample, p_convert_color); + if (p_saturation != 1.0) { + img->adjust_bcs(1.0, 1.0, p_saturation); + } icon->create_from_image(img); // in this case filter really helps return icon; @@ -126,7 +129,7 @@ static Ref<ImageTexture> editor_generate_icon(int p_index, bool p_convert_color, #define ADD_CONVERT_COLOR(dictionary, old_color, new_color) dictionary[Color::html(old_color)] = Color::html(new_color) #endif -void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme = true, int p_thumb_size = 32, bool p_only_thumbs = false) { +void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme = true, int p_thumb_size = 32, bool p_only_thumbs = false, float p_icon_saturation = 1.0) { #ifdef MODULE_SVG_ENABLED // The default icon theme is designed to be used for a dark theme. // This dictionary stores color codes to convert to other colors @@ -238,15 +241,14 @@ void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme = // Generate icons. if (!p_only_thumbs) { for (int i = 0; i < editor_icons_count; i++) { - float icon_scale = EDSCALE; + float saturation = p_icon_saturation; - // Always keep the DefaultProjectIcon at the default size - if (strcmp(editor_icons_names[i], "DefaultProjectIcon") == 0) { - icon_scale = 1.0f; + if (strcmp(editor_icons_names[i], "DefaultProjectIcon") == 0 || strcmp(editor_icons_names[i], "Godot") == 0 || strcmp(editor_icons_names[i], "Logo") == 0) { + saturation = 1.0; } const int is_exception = exceptions.has(editor_icons_names[i]); - const Ref<ImageTexture> icon = editor_generate_icon(i, !is_exception, icon_scale); + const Ref<ImageTexture> icon = editor_generate_icon(i, !is_exception, EDSCALE, saturation); p_theme->set_icon(editor_icons_names[i], "EditorIcons", icon); } @@ -290,6 +292,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { Color accent_color = EDITOR_GET("interface/theme/accent_color"); Color base_color = EDITOR_GET("interface/theme/base_color"); float contrast = EDITOR_GET("interface/theme/contrast"); + float icon_saturation = EDITOR_GET("interface/theme/icon_saturation"); float relationship_line_opacity = EDITOR_GET("interface/theme/relationship_line_opacity"); String preset = EDITOR_GET("interface/theme/preset"); @@ -393,6 +396,9 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { const Color highlight_color = Color(mono_color.r, mono_color.g, mono_color.b, 0.2); + float prev_icon_saturation = theme->has_color("icon_saturation", "Editor") ? theme->get_color("icon_saturation", "Editor").r : 1.0; + + theme->set_color("icon_saturation", "Editor", Color(icon_saturation, icon_saturation, icon_saturation)); //can't save single float in theme, so using color theme->set_color("accent_color", "Editor", accent_color); theme->set_color("highlight_color", "Editor", highlight_color); theme->set_color("base_color", "Editor", base_color); @@ -444,13 +450,13 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { //Register icons + font // the resolution and the icon color (dark_theme bool) has not changed, so we do not regenerate the icons - if (p_theme != nullptr && fabs(p_theme->get_constant("scale", "Editor") - EDSCALE) < 0.00001 && (bool)p_theme->get_constant("dark_theme", "Editor") == dark_theme) { + if (p_theme != nullptr && fabs(p_theme->get_constant("scale", "Editor") - EDSCALE) < 0.00001 && (bool)p_theme->get_constant("dark_theme", "Editor") == dark_theme && prev_icon_saturation == icon_saturation) { // register already generated icons for (int i = 0; i < editor_icons_count; i++) { theme->set_icon(editor_icons_names[i], "EditorIcons", p_theme->get_icon(editor_icons_names[i], "EditorIcons")); } } else { - editor_register_and_generate_icons(theme, dark_theme, thumb_size); + editor_register_and_generate_icons(theme, dark_theme, thumb_size, false, icon_saturation); } // thumbnail size has changed, so we regenerate the medium sizes if (p_theme != nullptr && fabs((double)p_theme->get_constant("thumb_size", "Editor") - thumb_size) > 0.00001) { @@ -698,9 +704,12 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { // PopupMenu const int popup_menu_margin_size = default_margin_size * 1.5 * EDSCALE; Ref<StyleBoxFlat> style_popup_menu = style_popup->duplicate(); - style_popup_menu->set_default_margin(SIDE_LEFT, popup_menu_margin_size); + // Use 1 pixel for the sides, since if 0 is used, the highlight of hovered items is drawn + // on top of the popup border. This causes a 'gap' in the panel border when an item is highlighted, + // and it looks weird. 1px solves this. + style_popup_menu->set_default_margin(SIDE_LEFT, 1 * EDSCALE); style_popup_menu->set_default_margin(SIDE_TOP, popup_menu_margin_size); - style_popup_menu->set_default_margin(SIDE_RIGHT, popup_menu_margin_size); + style_popup_menu->set_default_margin(SIDE_RIGHT, 1 * EDSCALE); style_popup_menu->set_default_margin(SIDE_BOTTOM, popup_menu_margin_size); theme->set_stylebox("panel", "PopupMenu", style_popup_menu); @@ -722,16 +731,63 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_icon("visibility_hidden", "PopupMenu", theme->get_icon("GuiVisibilityHidden", "EditorIcons")); theme->set_icon("visibility_visible", "PopupMenu", theme->get_icon("GuiVisibilityVisible", "EditorIcons")); theme->set_icon("visibility_xray", "PopupMenu", theme->get_icon("GuiVisibilityXray", "EditorIcons")); + theme->set_constant("vseparation", "PopupMenu", (extra_spacing + default_margin_size + 1) * EDSCALE); + theme->set_constant("item_start_padding", "PopupMenu", popup_menu_margin_size * EDSCALE); + theme->set_constant("item_end_padding", "PopupMenu", popup_menu_margin_size * EDSCALE); + + for (int i = 0; i < 16; i++) { + Color si_base_color = accent_color; + + float hue_rotate = (i * 2 % 16) / 16.0; + si_base_color.set_hsv(Math::fmod(float(si_base_color.get_h() + hue_rotate), float(1.0)), si_base_color.get_s(), si_base_color.get_v()); + si_base_color = accent_color.lerp(si_base_color, float(EDITOR_GET("docks/property_editor/subresource_hue_tint"))); + + Ref<StyleBoxFlat> sub_inspector_bg; - Ref<StyleBoxFlat> sub_inspector_bg = make_flat_stylebox(dark_color_1.lerp(accent_color, 0.08), 2, 0, 2, 2); - sub_inspector_bg->set_border_width(SIDE_LEFT, 2); - sub_inspector_bg->set_border_width(SIDE_RIGHT, 2); - sub_inspector_bg->set_border_width(SIDE_BOTTOM, 2); - sub_inspector_bg->set_border_color(accent_color * Color(1, 1, 1, 0.3)); - sub_inspector_bg->set_draw_center(true); + sub_inspector_bg = make_flat_stylebox(dark_color_1.lerp(si_base_color, 0.08), 2, 0, 2, 2); + + sub_inspector_bg->set_border_width(SIDE_LEFT, 2); + sub_inspector_bg->set_border_width(SIDE_RIGHT, 2); + sub_inspector_bg->set_border_width(SIDE_BOTTOM, 2); + sub_inspector_bg->set_border_width(SIDE_TOP, 2); + sub_inspector_bg->set_default_margin(SIDE_LEFT, 3); + sub_inspector_bg->set_default_margin(SIDE_RIGHT, 3); + sub_inspector_bg->set_default_margin(SIDE_BOTTOM, 10); + sub_inspector_bg->set_default_margin(SIDE_TOP, 5); + sub_inspector_bg->set_border_color(si_base_color * Color(0.7, 0.7, 0.7, 0.8)); + sub_inspector_bg->set_draw_center(true); + + theme->set_stylebox("sub_inspector_bg" + itos(i), "Editor", sub_inspector_bg); + + Ref<StyleBoxFlat> bg_color; + bg_color.instance(); + bg_color->set_bg_color(si_base_color * Color(0.7, 0.7, 0.7, 0.8)); + bg_color->set_border_width_all(0); + + Ref<StyleBoxFlat> bg_color_selected; + bg_color_selected.instance(); + bg_color_selected->set_border_width_all(0); + bg_color_selected->set_bg_color(si_base_color * Color(0.8, 0.8, 0.8, 0.8)); + + theme->set_stylebox("sub_inspector_property_bg" + itos(i), "Editor", bg_color); + theme->set_stylebox("sub_inspector_property_bg_selected" + itos(i), "Editor", bg_color_selected); + } + + theme->set_color("sub_inspector_property_color", "Editor", dark_theme ? Color(1, 1, 1, 1) : Color(0, 0, 0, 1)); + theme->set_constant("sub_inspector_font_offset", "Editor", 4 * EDSCALE); + + Ref<StyleBoxFlat> style_property_bg = style_default->duplicate(); + style_property_bg->set_bg_color(highlight_color); + style_property_bg->set_border_width_all(0); + + theme->set_constant("font_offset", "EditorProperty", 1 * EDSCALE); + theme->set_stylebox("bg_selected", "EditorProperty", style_property_bg); + theme->set_stylebox("bg", "EditorProperty", Ref<StyleBoxEmpty>(memnew(StyleBoxEmpty))); + theme->set_constant("vseparation", "EditorProperty", (extra_spacing + default_margin_size) * EDSCALE); + theme->set_color("error_color", "EditorProperty", error_color); + theme->set_color("property_color", "EditorProperty", property_color); - theme->set_stylebox("sub_inspector_bg", "Editor", sub_inspector_bg); theme->set_constant("inspector_margin", "Editor", 8 * EDSCALE); // Tree & ItemList background @@ -790,7 +846,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { Ref<StyleBoxFlat> style_tree_cursor = style_default->duplicate(); style_tree_cursor->set_draw_center(false); - style_tree_cursor->set_border_width_all(border_width); + style_tree_cursor->set_border_width_all(MAX(1, border_width)); style_tree_cursor->set_border_color(contrast_color_1); Ref<StyleBoxFlat> style_tree_title = style_default->duplicate(); @@ -1221,6 +1277,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_icon("add_preset", "ColorPicker", theme->get_icon("Add", "EditorIcons")); theme->set_icon("preset_bg", "ColorPicker", theme->get_icon("GuiMiniCheckerboard", "EditorIcons")); theme->set_icon("overbright_indicator", "ColorPicker", theme->get_icon("OverbrightIndicator", "EditorIcons")); + theme->set_icon("bar_arrow", "ColorPicker", theme->get_icon("ColorPickerBarArrow", "EditorIcons")); theme->set_icon("bg", "ColorPickerButton", theme->get_icon("GuiMiniCheckerboard", "EditorIcons")); @@ -1335,3 +1392,15 @@ Ref<Theme> create_custom_theme(const Ref<Theme> p_theme) { return theme; } + +Ref<ImageTexture> create_unscaled_default_project_icon() { +#ifdef MODULE_SVG_ENABLED + for (int i = 0; i < editor_icons_count; i++) { + // ESCALE should never affect size of the icon + if (strcmp(editor_icons_names[i], "DefaultProjectIcon") == 0) { + return editor_generate_icon(i, false, 1.0); + } + } +#endif + return Ref<ImageTexture>(memnew(ImageTexture)); +} diff --git a/editor/editor_themes.h b/editor/editor_themes.h index 852edf7669..c040654220 100644 --- a/editor/editor_themes.h +++ b/editor/editor_themes.h @@ -31,10 +31,13 @@ #ifndef EDITOR_THEMES_H #define EDITOR_THEMES_H +#include "scene/resources/texture.h" #include "scene/resources/theme.h" Ref<Theme> create_editor_theme(Ref<Theme> p_theme = nullptr); Ref<Theme> create_custom_theme(Ref<Theme> p_theme = nullptr); +Ref<ImageTexture> create_unscaled_default_project_icon(); + #endif diff --git a/editor/fileserver/editor_file_server.cpp b/editor/fileserver/editor_file_server.cpp index 07edae833d..d80003a12a 100644 --- a/editor/fileserver/editor_file_server.cpp +++ b/editor/fileserver/editor_file_server.cpp @@ -43,7 +43,7 @@ void EditorFileServer::_close_client(ClientData *cd) { cd->connection->disconnect_from_host(); { MutexLock lock(cd->efs->wait_mutex); - cd->efs->to_wait.insert(&cd->thread); + cd->efs->to_wait.insert(cd->thread); } while (cd->files.size()) { memdelete(cd->files.front()->get()); @@ -278,7 +278,8 @@ void EditorFileServer::_thread_start(void *s) { cd->connection = self->server->take_connection(); cd->efs = self; cd->quit = false; - cd->thread.start(_subthread_start, cd); + cd->thread = memnew(Thread); + cd->thread->start(_subthread_start, cd); } } diff --git a/editor/fileserver/editor_file_server.h b/editor/fileserver/editor_file_server.h index e4c8327d76..8ffd4f9692 100644 --- a/editor/fileserver/editor_file_server.h +++ b/editor/fileserver/editor_file_server.h @@ -47,7 +47,7 @@ class EditorFileServer : public Object { }; struct ClientData { - Thread thread; + Thread *thread; Ref<StreamPeerTCP> connection; Map<int, FileAccess *> files; EditorFileServer *efs = nullptr; diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index e1c66f43b9..772eff5f45 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -945,7 +945,25 @@ void FileSystemDock::_select_file(const String &p_path, bool p_select_in_favorit } } else if (fpath != "Favorites") { if (ResourceLoader::get_resource_type(fpath) == "PackedScene") { - editor->open_request(fpath); + bool is_imported = false; + + { + List<String> importer_exts; + ResourceImporterScene::get_singleton()->get_recognized_extensions(&importer_exts); + String extension = fpath.get_extension(); + for (List<String>::Element *E = importer_exts.front(); E; E = E->next()) { + if (extension.nocasecmp_to(E->get())) { + is_imported = true; + break; + } + } + } + + if (is_imported) { + ResourceImporterScene::get_singleton()->show_advanced_options(fpath); + } else { + editor->open_request(fpath); + } } else { editor->load_resource(fpath); } @@ -1411,14 +1429,26 @@ void FileSystemDock::_make_scene_confirm() { void FileSystemDock::_file_removed(String p_file) { emit_signal("file_removed", p_file); - path = "res://"; + // Find the closest parent directory available, in case multiple items were deleted along the same path. + path = p_file.get_base_dir(); + DirAccessRef da = DirAccess::create(DirAccess::ACCESS_RESOURCES); + while (!da->dir_exists(path)) { + path = path.get_base_dir(); + } + current_path->set_text(path); } void FileSystemDock::_folder_removed(String p_folder) { emit_signal("folder_removed", p_folder); - path = "res://"; + // Find the closest parent directory available, in case multiple items were deleted along the same path. + path = p_folder.get_base_dir(); + DirAccessRef da = DirAccess::create(DirAccess::ACCESS_RESOURCES); + while (!da->dir_exists(path)) { + path = path.get_base_dir(); + } + current_path->set_text(path); } @@ -1586,7 +1616,7 @@ void FileSystemDock::_move_operation_confirm(const String &p_to_path, bool p_ove print_verbose("FileSystem: saving moved scenes."); _save_scenes_after_move(file_renames); - path = "res://"; + path = p_to_path; current_path->set_text(path); } } @@ -2706,7 +2736,22 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) { // `KEY_MASK_CMD | KEY_C` conflicts with other editor shortcuts. ED_SHORTCUT("filesystem_dock/copy_path", TTR("Copy Path"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_C); ED_SHORTCUT("filesystem_dock/duplicate", TTR("Duplicate..."), KEY_MASK_CMD | KEY_D); + +#if defined(WINDOWS_ENABLED) + // TRANSLATORS: This string is only used on Windows, as it refers to the system trash + // as "Recycle Bin" instead of "Trash". Make sure to use the translation of "Recycle Bin" + // recommended by Microsoft for the target language. + ED_SHORTCUT("filesystem_dock/delete", TTR("Move to Recycle Bin"), KEY_DELETE); +#elif defined(OSX_ENABLED) + // TRANSLATORS: This string is only used on macOS, as it refers to the system trash + // as "Bin" instead of "Trash". Make sure to use the translation of "Bin" + // recommended by Apple for the target language. + ED_SHORTCUT("filesystem_dock/delete", TTR("Move to Bin"), KEY_DELETE); +#else + // TRANSLATORS: This string is only used on platforms other than Windows and macOS. ED_SHORTCUT("filesystem_dock/delete", TTR("Move to Trash"), KEY_DELETE); +#endif + ED_SHORTCUT("filesystem_dock/rename", TTR("Rename..."), KEY_F2); VBoxContainer *top_vbc = memnew(VBoxContainer); diff --git a/editor/find_in_files.cpp b/editor/find_in_files.cpp index c2f2254023..47079a92b7 100644 --- a/editor/find_in_files.cpp +++ b/editor/find_in_files.cpp @@ -463,7 +463,7 @@ void FindInFilesDialog::_notification(int p_what) { for (int i = 0; i < _filters_container->get_child_count(); i++) { _filters_container->get_child(i)->queue_delete(); } - Array exts = ProjectSettings::get_singleton()->get("editor/search_in_file_extensions"); + Array exts = ProjectSettings::get_singleton()->get("editor/script/search_in_file_extensions"); for (int i = 0; i < exts.size(); ++i) { CheckBox *cb = memnew(CheckBox); cb->set_text(exts[i]); @@ -687,6 +687,9 @@ void FindInFilesPanel::stop_search() { void FindInFilesPanel::_notification(int p_what) { if (p_what == NOTIFICATION_PROCESS) { _progress_bar->set_as_ratio(_finder->get_progress()); + } else if (p_what == NOTIFICATION_THEME_CHANGED) { + _search_text_label->add_theme_font_override("font", get_theme_font("source", "EditorFonts")); + _results_display->add_theme_font_override("font", get_theme_font("source", "EditorFonts")); } } diff --git a/editor/icons/ColorPickerBarArrow.svg b/editor/icons/ColorPickerBarArrow.svg new file mode 100644 index 0000000000..9d034106ee --- /dev/null +++ b/editor/icons/ColorPickerBarArrow.svg @@ -0,0 +1 @@ +<svg height="20" viewBox="0 0 16 20" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 16h12l-6-6z" fill="#e0e0e0" stroke-width="2"/></svg> diff --git a/editor/icons/GPUParticlesAttractorBox.svg b/editor/icons/GPUParticlesAttractorBox.svg new file mode 100644 index 0000000000..3c27b2d3cb --- /dev/null +++ b/editor/icons/GPUParticlesAttractorBox.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><circle cx="8" cy="8" fill="#fc9c9c" fill-opacity=".996078" r="1"/><g fill="none" stroke="#fc9c9c" stroke-opacity=".996078"><ellipse cx="8" cy="-8" rx="2.339226" ry="4.949748" transform="rotate(90)"/><ellipse cx="8" cy="8" rx="2.339226" ry="4.949748"/><path d="m1.498906 1.498906h13.002189v13.002188h-13.002189z" stroke-width=".997813"/></g></svg> diff --git a/editor/icons/GPUParticlesAttractorSphere.svg b/editor/icons/GPUParticlesAttractorSphere.svg new file mode 100644 index 0000000000..5473a23854 --- /dev/null +++ b/editor/icons/GPUParticlesAttractorSphere.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><ellipse cx="-8" cy="-7.999999" fill="none" rx="6.499003" ry="6.499001" stroke="#fc9c9c" stroke-opacity=".996078" stroke-width="1.002" transform="scale(-1)"/><circle cx="8" cy="8" fill="#fc9c9c" fill-opacity=".996078" r="1"/><g fill="none" stroke="#fc9c9c" stroke-opacity=".996078"><ellipse cx="11.313708" rx="2.339226" ry="4.949748" transform="matrix(.70710678 .70710678 -.70710678 .70710678 0 0)"/><ellipse cy="11.313708" rx="2.339226" ry="4.949748" transform="matrix(.70710678 -.70710678 .70710678 .70710678 0 0)"/></g></svg> diff --git a/editor/icons/GPUParticlesAttractorVectorField.svg b/editor/icons/GPUParticlesAttractorVectorField.svg new file mode 100644 index 0000000000..93a29789e3 --- /dev/null +++ b/editor/icons/GPUParticlesAttractorVectorField.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><ellipse cx="6.663637" cy="9.245457" fill="#fc9c9c" fill-opacity=".996078" rx="1.030661" ry=".998146"/><ellipse cx="-6.672815" cy="-9.387111" fill="none" rx="2.408711" ry="5.096776" stroke="#fc9c9c" stroke-opacity=".996078" stroke-width="1.0297" transform="matrix(-.99999945 .00104887 .00104887 -.99999945 0 0)"/><ellipse cx="9.387111" cy="-6.672815" fill="none" rx="2.408711" ry="5.096776" stroke="#fc9c9c" stroke-opacity=".996078" stroke-width="1.0297" transform="matrix(-.00104887 .99999945 -.99999945 .00104887 0 0)"/><g fill="#fc9c9c" fill-opacity=".996078"><path d="m11.8 15 2.4-2.4.8.8v-2.4h-2.4l.8.8-2.4 2.4z"/><path d="m11 6 3-3 1 1v-3h-3l1 1-3 3z"/><path d="m1.8 5 2.4-2.4.8.8v-2.4h-2.4l.8.8-2.4 2.4z"/></g></svg> diff --git a/editor/icons/GPUParticlesCollisionBox.svg b/editor/icons/GPUParticlesCollisionBox.svg new file mode 100644 index 0000000000..f7296b34c3 --- /dev/null +++ b/editor/icons/GPUParticlesCollisionBox.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 14.999999 14.999999" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#fc9c9c" fill-opacity=".996078"><path d="m7.5 2.8124998-5.5883107 2.7941554v5.7660988l5.5883107 2.794155 5.588311-2.794155v-5.7660988zm0 1.6886278 3.145021 1.5732692-3.145021 1.5717523-3.1450214-1.5717523zm-3.9916505 2.8362274 3.1933204 1.5966602v3.1465378l-3.1933204-1.598256zm7.9833015 0v3.145021l-3.1933209 1.598257v-3.146538z" stroke-width=".851579"/><circle cx="1.875" cy="3.75" r=".9375"/><circle cx="13.124999" cy="3.75" r=".9375"/><circle cx="9.374999" cy="1.875" r=".9375"/><circle cx="5.625" cy="1.875" r=".9375"/></g></svg> diff --git a/editor/icons/GPUParticlesCollisionHeightField.svg b/editor/icons/GPUParticlesCollisionHeightField.svg new file mode 100644 index 0000000000..b483f299e9 --- /dev/null +++ b/editor/icons/GPUParticlesCollisionHeightField.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#fc9c9c"><path d="m1 10c1-1 3-2 3-4s2-4 4-4 4 2 4 4 2 3 3 4l-7 5z"/><circle cx="2" cy="6" r="1"/><circle cx="14" cy="6" r="1"/><circle cx="12" cy="2" r="1"/><circle cx="4" cy="2" r="1"/></g></svg> diff --git a/editor/icons/GPUParticlesCollisionSDF.svg b/editor/icons/GPUParticlesCollisionSDF.svg new file mode 100644 index 0000000000..6279990f3a --- /dev/null +++ b/editor/icons/GPUParticlesCollisionSDF.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14 14h-12v-9s3 4 5.9999999 3.9999999c3.0000001-.0000001 6.0000001-3.9999999 6.0000001-3.9999999z" fill="none" stroke="#fc9c9c" stroke-linejoin="round" stroke-opacity=".996078" stroke-width="2"/><g fill="#fc9c9c" fill-opacity=".996078"><circle cx="2" cy="2" r="1"/><circle cx="14" cy="2" r="1"/><circle cx="10" cy="5" r="1"/><circle cx="6" cy="5" r="1"/></g></svg> diff --git a/editor/icons/GPUParticlesCollisionSphere.svg b/editor/icons/GPUParticlesCollisionSphere.svg new file mode 100644 index 0000000000..fc7715445c --- /dev/null +++ b/editor/icons/GPUParticlesCollisionSphere.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#fc9c9c" fill-opacity=".996078"><path d="m8 3.0532484c-3.2888554 0-5.9733758 2.6845204-5.9733758 5.9733758 0 3.2889408 2.6845204 5.9733758 5.9733758 5.9733758 3.288855 0 5.973376-2.684435 5.973376-5.9733758 0-3.2888554-2.684521-5.9733758-5.973376-5.9733758zm-.8533394 1.79005v4.1567016c-1.1034532-.0608789-2.2238878-.2544573-3.3650586-.5900074.256693-1.7901354 1.6087154-3.2141029 3.3650586-3.5667027zm1.7066788 0c1.7535276.3520281 3.1035956 1.77213 3.3633516 3.55834-1.113266.3129793-2.2321649.5142138-3.3633516.5866709zm3.2300606 5.3599956c-.434043 1.51792-1.663927 2.690664-3.2300606 3.005035v-2.518376c1.0915918-.0617 2.1691036-.227875 3.2300606-.486668zm-8.161765.015c1.0865571.272147 2.162106.428504 3.2250256.480003v2.510013c-1.5608431-.313338-2.7870065-1.479605-3.2250256-2.990016z" stroke-width=".853339"/><circle cx="2" cy="5" r="1"/><circle cx="14" cy="5" r="1"/><circle cx="10" cy="2" r="1"/><circle cx="6" cy="2" r="1"/></g></svg> diff --git a/editor/icons/Logo.svg b/editor/icons/Logo.svg index d7aef39cc9..a4ad488396 100644 --- a/editor/icons/Logo.svg +++ b/editor/icons/Logo.svg @@ -1 +1 @@ -<svg height="69" viewBox="0 0 187 69" width="187" xmlns="http://www.w3.org/2000/svg"><path d="m91.912 19.51c-3.5233 0-6.278 1.1097-8.2676 3.3281-1.9911 2.2193-2.9844 5.1004-2.9844 8.6465 0 4.1636 1.0165 7.3207 3.0508 9.4707 2.0379 2.1497 4.7123 3.2227 8.0293 3.2227 1.7838 0 3.3686-.15384 4.752-.46289 1.3848-.30784 2.3038-.62367 2.7617-.94336l.13867-10.736c0-.62388-1.6471-.90785-3.4941-.93945-1.847-.02857-3.9609.35742-3.9609.35742v3.6055h2.125l-.023438 1.6055c0 .59532-.59062.89453-1.7676.89453-1.1785 0-2.2182-.4989-3.1211-1.4941-.90498-.99645-1.3555-2.4517-1.3555-4.3711 0-1.9233.43964-3.3428 1.3203-4.2578.87885-.9141 2.0322-1.3711 3.4492-1.3711.59532 0 1.2107.095008 1.8516.29102.64121.19418 1.0686.37639 1.2871.54688.21667.17534.42435.25781.61914.25781.19388 0 .50715-.22698.94141-.68555.43487-.45735.82427-1.1501 1.168-2.0742.34218-.92899.51367-1.6414.51367-2.1465 0-.50111-.011023-.84501-.033203-1.0273-.48045-.52573-1.3668-.94394-2.6602-1.2539-1.2909-.30906-2.7387-.46289-4.3398-.46289zm21.049 0c-3.2367 0-5.8788 1.0413-7.9258 3.1211-2.0464 2.0826-3.0703 5.1404-3.0703 9.1797 0 4.0369 1.0128 7.1085 3.0352 9.2129 2.0251 2.1026 4.6444 3.1543 7.8574 3.1543 3.2145 0 5.8383-1.0111 7.875-3.0332 2.0367-2.0263 3.0527-5.1142 3.0527-9.2656 0-4.1484-.99433-7.2508-2.9863-9.2969-1.9884-2.05-4.6018-3.0723-7.8379-3.0723zm45.504 0c-3.2379 0-5.8792 1.0413-7.9277 3.1211-2.0461 2.0826-3.0684 5.1404-3.0684 9.1797 0 4.0369 1.0104 7.1085 3.0352 9.2129 2.0233 2.1026 4.6432 3.1543 7.8574 3.1543 3.213 0 5.8373-1.0111 7.873-3.0332 2.0364-2.0263 3.0547-5.1142 3.0547-9.2656 0-4.1484-.9939-7.2508-2.9844-9.2969-1.9908-2.05-4.6031-3.0723-7.8398-3.0723zm-30.105.30859c-.45888 0-.82988.16637-1.1152.49609-.28717.33489-.42969.78715-.42969 1.3594v20.584c0 1.053.58624 1.5781 1.752 1.5781h5.8652c7.1824-.000001 10.773-4.2092 10.773-12.627 0-3.9348-.94335-6.8151-2.832-8.6445-1.8853-1.83-4.6472-2.7461-8.2832-2.7461h-5.7305zm42.807 0c-.38928 0-.66468.52801-.82422 1.5801-.0687.50294-.10157 1.0191-.10157 1.543 0 .52694.03287 1.0409.10157 1.543.15954 1.0548.43494 1.5801.82422 1.5801h4.1152v17.225c0 .45462 1.1351.68555 3.3984.68555 2.2655 0 3.3965-.23093 3.3965-.68555v-17.225h4.0137c.38868 0 .66225-.52528.82422-1.5801.0672-.50202.10156-1.016.10156-1.543.00001-.52391-.03436-1.04-.10156-1.543-.16197-1.0521-.43554-1.5801-.82422-1.5801h-14.924zm-58.291 6.2793c1.0989 0 2.0193.49244 2.7617 1.4746.74331.98339 1.1152 2.3913 1.1152 4.2207 0 1.8309-.35955 3.2363-1.0801 4.2188-.72053.98612-1.6597 1.4785-2.8145 1.4785-1.1554 0-2.0859-.48441-2.7949-1.459-.71019-.97154-1.0644-2.3663-1.0644-4.1875 0-1.8173.37148-3.2302 1.1133-4.2363.74574-1.0053 1.6663-1.5098 2.7637-1.5098zm45.504 0c1.0989 0 2.0181.49244 2.7617 1.4746.74331.98339 1.1152 2.3913 1.1152 4.2207 0 1.8309-.3612 3.2363-1.082 4.2188-.71961.98612-1.6574 1.4785-2.8125 1.4785-1.1554 0-2.0888-.48441-2.7969-1.459-.70806-.97154-1.0625-2.3663-1.0625-4.1875 0-1.8173.37179-3.2302 1.1133-4.2363.74453-1.0053 1.666-1.5098 2.7637-1.5098zm-24.977.23828h.34375c1.4638 0 2.5334.33466 3.209.99805.6722.66157 1.0098 2.0859 1.0098 4.2715 0 2.1847-.32289 3.7447-.97656 4.6816-.65214.9378-1.6059 1.4082-2.8652 1.4082-.34218 0-.54909-.063339-.61719-.18945-.06873-.12672-.10352-.42897-.10352-.9082v-10.262z" fill="#fff"/><path d="m137.91 48.551v1.2109h.85938v-1.2109zm-52.396.58984c-.99736 0-1.7963.32424-2.3926.96484-.59745.64576-.89453 1.5712-.89453 2.7773v3.0742c0 1.2329.31639 2.1765.94727 2.832.6333.66066 1.467.98828 2.5039.98828.78586 0 1.4321-.16147 1.9414-.48633.50993-.32273.8592-.67938 1.0488-1.0684v-3.6875h-3.0059v.74805h2.1465v2.6934c-.13766.30115-.38143.55386-.73242.76172-.34978.2109-.8171.31445-1.3984.31445-.79619 0-1.4265-.2632-1.8945-.78711-.46799-.52786-.70312-1.2936-.70312-2.2988v-3.0918c0-.96941.21778-1.7078.65234-2.2168.43578-.51023 1.0297-.76367 1.7812-.76367.74271 0 1.3056.19019 1.6836.56641.38017.37925.58276.91542.61133 1.6113h.79492l.013672-.041016c-.024311-.90802-.30456-1.6179-.83789-2.127-.53484-.50719-1.2907-.76367-2.2656-.76367zm7.6133 2.6641c-.719 0-1.3111.22524-1.7715.67773-.46222.45371-.68069.96571-.6582 1.5449l.013672.041015.79688.007813c0-.42696.14768-.78487.44336-1.0781.2966-.29508.67455-.44141 1.1328-.44141.4926 0 .87459.15388 1.1523.45898.27198.30906.41016.73655.41016 1.2793v.94531h-1.3418c-.85666 0-1.5379.21084-2.0391.63477-.50142.42392-.75195.99502-.75195 1.707 0 .67372.17358 1.2075.51758 1.6035.34613.39445.83497.5918 1.4707.5918.45462 0 .86723-.12355 1.2383-.37305.37166-.24767.67317-.56424.90625-.94531 0 .17413.01089.34527.03125.51758.02097.16927.053163.38614.095703.65234h.88867c-.062302-.24767-.10234-.49621-.12695-.75391-.02401-.25436-.037109-.52051-.037109-.79492v-3.7676c0-.80622-.21809-1.4265-.65234-1.8613-.43669-.43061-1.0083-.64648-1.7188-.64648zm7.1152 0c-.45462 0-.85109.11505-1.1875.3457-.33519.23369-.60486.56357-.80664.99023l-.074219-1.1934h-.75195v7.6816h.85352v-5.5293c.11791-.47346.31244-.84655.58594-1.1191.27168-.27107.63379-.4082 1.082-.4082.4689 0 .83314.19466 1.0957.58789.26378.39323.39258 1.0508.39258 1.9707v4.498h.85351v-4.6211-.19922c.0623-.64455.23396-1.1785.51172-1.6055.27927-.42696.66855-.63672 1.166-.63672.47285 0 .83879.19223 1.0938.57422.25345.38138.38281 1.0443.38281 1.9863v4.502h.85742v-4.4863c0-1.1332-.18468-1.9728-.55664-2.5195-.37044-.54548-.89268-.81836-1.5664-.81836-.48897 0-.91182.1465-1.2598.43945-.34796.29234-.61537.69589-.80469 1.207-.148-.55369-.38151-.966-.69726-1.2383-.31543-.2732-.70589-.4082-1.1699-.4082zm10.316 0c-.74423-.000001-1.3797.32125-1.9082.96094-.52725.64273-.78906 1.4505-.78906 2.4199v1.2754c0 .96758.26259 1.762.7871 2.3828.52604.62206 1.2032.93359 2.0312.93359.5157 0 .95833-.090281 1.3242-.26562.36679-.17626.66658-.41287.89844-.70703l-.34961-.60547c-.21728.27441-.4784.4836-.7832.63281-.3048.14586-.66987.2207-1.0898.2207-.60443 0-1.0864-.24489-1.4414-.74023-.35433-.49412-.53321-1.1138-.53321-1.8574v-.63867h4.3965v-.84375c0-.96667-.22381-1.7371-.66992-2.3105-.44519-.57253-1.0684-.85742-1.873-.85742zm9.4727 0c-.74423-.000001-1.3782.32125-1.9082.96094-.52603.64273-.79101 1.4505-.79101 2.4199v1.2754c0 .96758.26241 1.762.78906 2.3828.52512.62206 1.2028.93359 2.0312.93359.51601 0 .95639-.090281 1.3223-.26562.36741-.17626.66822-.41287.90039-.70703l-.34766-.60547c-.21972.27441-.4811.4836-.78711.63281-.30389.14586-.66639.2207-1.0879.2207-.60656 0-1.0883-.24489-1.4414-.74023-.35646-.49412-.5332-1.1138-.5332-1.8574v-.63867h4.3945v-.84375c0-.96667-.22338-1.7371-.66797-2.3105-.44398-.57253-1.0699-.85742-1.873-.85742zm6.8672 0c-.45614 0-.85274.12451-1.1894.36914-.33975.24342-.60962.5923-.81445 1.043l-.07031-1.2695h-.76172v7.6816h.85351v-5.4824c.14617-.47923.36569-.85918.66016-1.1445.29325-.28809.65767-.42969 1.0938-.42969.48622 0 .85922.17765 1.1133.5332.25557.35555.38477.96807.38477 1.8457v4.6777h.85937v-4.6855c0-1.0736-.18381-1.866-.55273-2.375-.36497-.50993-.89-.76367-1.5762-.76367zm6.2539 0c-.77674 0-1.386.32888-1.8242.98437-.44186.65883-.66211 1.5326-.66211 2.6211l.00196 1.0508c0 1.0031.21834 1.8072.65625 2.4102.43699.60413 1.0429.90625 1.8144.90625.41602 0 .78387-.091234 1.0996-.27539.31695-.18324.58484-.4491.80273-.79492v.92969c0 .75881-.14785 1.3303-.4414 1.7266-.29235.39111-.74301.58789-1.3535.58789-.30359 0-.59763-.04082-.88086-.125-.28565-.081443-.54279-.19619-.77344-.3457l-.23632.74805c.27047.15164.57916.27315.92773.36523.34795.092075.67388.13867.97656.13867.84208 0 1.494-.27297 1.9531-.81055.45857-.53971.68554-1.3009.68554-2.2852v-7.6895h-.72265l-.08399 1.0684c-.21485-.38533-.48269-.68758-.80664-.89453-.32334-.2109-.70159-.31641-1.1328-.31641zm10.467 0c-.45401 0-.85062.12451-1.1895.36914-.33914.24342-.60902.5923-.81445 1.043l-.07031-1.2695h-.75977v7.6816h.85352v-5.4824c.14556-.47923.3663-.85918.66016-1.1445.29295-.28809.65797-.42969 1.0937-.42969.48775 0 .85711.17765 1.1133.5332.25496.35555.38476.96807.38476 1.8457v4.6777h.85742v-4.6855c0-1.0736-.18081-1.866-.54882-2.375-.36588-.50993-.8939-.76367-1.5801-.76367zm6.4043 0c-.74271-.000001-1.3778.32125-1.9062.96094-.52724.64273-.79101 1.4505-.79101 2.4199v1.2754c0 .96758.26334 1.762.78906 2.3828.52361.62206 1.2007.93359 2.0312.93359.5154 0 .9567-.090281 1.3223-.26562.3668-.17626.6667-.41287.90039-.70703l-.34961-.60547c-.2194.27441-.47958.4836-.78711.63281-.30359.14586-.66597.2207-1.0859.2207-.60717 0-1.089-.24489-1.4434-.74023-.35464-.49412-.5332-1.1138-.5332-1.8574v-.63867h4.3965v-.84375c0-.96667-.22369-1.7371-.66797-2.3105-.44551-.57253-1.0709-.85742-1.875-.85742zm-12.113.14258v7.6816h.85938v-7.6816zm-27.352.60938c.53029 0 .9445.20789 1.2441.62695.29781.41876.44531.94616.44531 1.5801v.33008h-3.543c.01429-.71688.19281-1.3186.53711-1.8066.34401-.48622.78217-.73047 1.3164-.73047zm9.4727 0c.52998 0 .94406.20789 1.2422.62695.29963.41876.44727.94616.44727 1.5801v.33008h-3.543c.0155-.71688.19298-1.3186.53516-1.8066.3437-.48622.7826-.73047 1.3184-.73047zm29.992 0c.53089 0 .94602.20789 1.2441.62695.29902.41876.44532.94616.44532 1.5801v.33008h-3.543c.01519-.71688.19402-1.3186.53711-1.8066.34218-.48622.78064-.73047 1.3164-.73047zm-16.686.015625c.42119 0 .77033.1246 1.0469.375.27684.25466.4967.58706.65625.99609v3.8047c-.16593.39718-.39.70872-.67383.93359-.28475.22488-.63089.33594-1.043.33594-.6014 0-1.0536-.22975-1.3496-.69531-.29964-.4613-.44727-1.0819-.44727-1.8613v-1.0508c0-.84177.15149-1.527.45508-2.0527.30146-.52482.75528-.78516 1.3555-.78516zm-40.057 3.3281h1.3652v1.6621c-.15286.42089-.40964.76752-.77734 1.041-.3671.27228-.78783.40625-1.2598.40625-.39262 0-.69782-.12824-.91602-.38867-.2185-.25952-.32617-.59591-.32617-1.0059 0-.48531.17262-.89402.52148-1.2207.34795-.32881.81215-.49414 1.3926-.49414z" fill="#e0e0e0"/><path d="m27 3c-3.0948.68801-6.1571 1.6452-9.0273 3.0898.06564 2.5344.23035 4.963.5625 7.4297-1.1147.71414-2.287 1.3281-3.3281 2.1641-1.0578.81382-2.1378 1.5912-3.0957 2.543-1.9136-1.2657-3.9389-2.454-6.0254-3.5039-2.2491 2.4205-4.3524 5.0317-6.0703 7.9551 1.2924 2.0908 2.6428 4.0523 4.0996 5.9121h.041016v14.438 1.834 1.6699c.03282.000304.06514.000806.097656.003906l11 1.0605c.57617.05561 1.0282.52027 1.0684 1.0977l.33789 4.8555 9.5957.68359.66016-4.4805c.0857-.58104.58415-1.0117 1.1719-1.0117h11.605c.58742 0 1.0862.43068 1.1719 1.0117l.66016 4.4805 9.5957-.68359.33789-4.8555c.04042-.57739.49219-1.0417 1.0684-1.0977l10.996-1.0605c.032519-.003.064836-.003606.097656-.003906v-1.4316l.003906-.001953v-16.508h.041016c1.4571-1.8598 2.8066-3.8214 4.0996-5.9121-1.7173-2.9234-3.8232-5.5346-6.0723-7.9551-2.0859 1.0499-4.1118 2.2382-6.0254 3.5039-.95756-.95178-2.0363-1.7292-3.0957-2.543-1.0408-.836-2.2136-1.4499-3.3262-2.1641.33124-2.4667.49656-4.8952.5625-7.4297-2.8706-1.4447-5.933-2.4018-9.0293-3.0898-1.2362 2.0777-2.367 4.3278-3.3516 6.5273-1.1675-.1951-2.3391-.26727-3.5137-.28125v-.0019532c-.0082 0-.016447.0019531-.023437.0019532-.0073 0-.014194-.0019532-.021484-.0019532v.0019532c-1.1767.013979-2.3497.086153-3.5176.28125-.98399-2.1996-2.1135-4.4497-3.3516-6.5273zm-22.863 45.904c.0045599 1.063.019531 2.2271.019531 2.459 0 10.446 13.251 15.468 29.715 15.525h.019531.019531c16.464-.05774 29.711-5.0795 29.711-15.525 0-.23612.014661-1.3954.019531-2.459l-9.8867.95312-.3418 4.8809c-.04102.58833-.50933 1.0574-1.0977 1.0996l-11.717.83594c-.02857.0021-.055724.003906-.083984.003906-.58225 0-1.0859-.42704-1.1719-1.0117l-.67188-4.5566h-9.5586l-.67188 4.5566c-.09025.61325-.63836 1.0531-1.2559 1.0078l-11.717-.83594c-.58833-.04224-1.0566-.51128-1.0977-1.0996l-.3418-4.8809-9.8906-.95312z" fill="#478cbf"/><path d="m18.299 29.246c-3.6594 0-6.6289 2.9669-6.6289 6.627 0 3.6625 2.9695 6.6289 6.6289 6.6289 3.6613 0 6.627-2.9664 6.627-6.6289 0-3.66-2.9657-6.627-6.627-6.627zm31.186 0c-3.6619 0-6.6289 2.9669-6.6289 6.627 0 3.6625 2.967 6.6289 6.6289 6.6289 3.6591 0 6.627-2.9664 6.627-6.6289 0-3.66-2.9678-6.627-6.627-6.627zm-15.594 3.8789c-1.1785 0-2.1348.86781-2.1348 1.9375v6.1035c0 1.0706.95628 1.9395 2.1348 1.9395s2.1348-.86885 2.1348-1.9395v-6.1035c0-1.0697-.95628-1.9375-2.1348-1.9375z" fill="#f6f6f6"/><path d="m18.932 31.865c-2.4299 0-4.4004 1.9711-4.4004 4.4004s1.9705 4.3984 4.4004 4.3984c2.4311 0 4.4004-1.9691 4.4004-4.3984s-1.9693-4.4004-4.4004-4.4004zm29.916 0c-2.4293 0-4.3984 1.9711-4.3984 4.4004s1.9691 4.3984 4.3984 4.3984c2.4317 0 4.4004-1.9691 4.4004-4.3984s-1.9687-4.4004-4.4004-4.4004z" fill="#414042"/></svg> +<svg height="69" viewBox="0 0 187 69" width="187" xmlns="http://www.w3.org/2000/svg"><path d="m91.912 19.51c-3.5233 0-6.278 1.1097-8.2676 3.3281-1.9911 2.2193-2.9844 5.1004-2.9844 8.6465 0 4.1636 1.0165 7.3207 3.0508 9.4707 2.0379 2.1497 4.7123 3.2227 8.0293 3.2227 1.7838 0 3.3686-.15384 4.752-.46289 1.3848-.30784 2.3038-.62367 2.7617-.94336l.13867-10.736c0-.62388-1.6471-.90785-3.4941-.93945-1.847-.02857-3.9609.35742-3.9609.35742v3.6055h2.125l-.023438 1.6055c0 .59532-.59062.89453-1.7676.89453-1.1785 0-2.2182-.4989-3.1211-1.4941-.90498-.99645-1.3555-2.4517-1.3555-4.3711 0-1.9233.43964-3.3428 1.3203-4.2578.87885-.9141 2.0322-1.3711 3.4492-1.3711.59532 0 1.2107.095008 1.8516.29102.64121.19418 1.0686.37639 1.2871.54688.21667.17534.42435.25781.61914.25781.19388 0 .50715-.22698.94141-.68555.43487-.45735.82427-1.1501 1.168-2.0742.34218-.92899.51367-1.6414.51367-2.1465 0-.50111-.011023-.84501-.033203-1.0273-.48045-.52573-1.3668-.94394-2.6602-1.2539-1.2909-.30906-2.7387-.46289-4.3398-.46289zm21.049 0c-3.2367 0-5.8788 1.0413-7.9258 3.1211-2.0464 2.0826-3.0703 5.1404-3.0703 9.1797 0 4.0369 1.0128 7.1085 3.0352 9.2129 2.0251 2.1026 4.6444 3.1543 7.8574 3.1543 3.2145 0 5.8383-1.0111 7.875-3.0332 2.0367-2.0263 3.0527-5.1142 3.0527-9.2656 0-4.1484-.99433-7.2508-2.9863-9.2969-1.9884-2.05-4.6018-3.0723-7.8379-3.0723zm45.504 0c-3.2379 0-5.8792 1.0413-7.9277 3.1211-2.0461 2.0826-3.0684 5.1404-3.0684 9.1797 0 4.0369 1.0104 7.1085 3.0352 9.2129 2.0233 2.1026 4.6432 3.1543 7.8574 3.1543 3.213 0 5.8373-1.0111 7.873-3.0332 2.0364-2.0263 3.0547-5.1142 3.0547-9.2656 0-4.1484-.9939-7.2508-2.9844-9.2969-1.9908-2.05-4.6031-3.0723-7.8398-3.0723zm-30.105.30859c-.45888 0-.82988.16637-1.1152.49609-.28717.33489-.42969.78715-.42969 1.3594v20.584c0 1.053.58624 1.5781 1.752 1.5781h5.8652c7.1824-.000001 10.773-4.2092 10.773-12.627 0-3.9348-.94335-6.8151-2.832-8.6445-1.8853-1.83-4.6472-2.7461-8.2832-2.7461h-5.7305zm42.807 0c-.38928 0-.66468.52801-.82422 1.5801-.0687.50294-.10157 1.0191-.10157 1.543 0 .52694.03287 1.0409.10157 1.543.15954 1.0548.43494 1.5801.82422 1.5801h4.1152v17.225c0 .45462 1.1351.68555 3.3984.68555 2.2655 0 3.3965-.23093 3.3965-.68555v-17.225h4.0137c.38868 0 .66225-.52528.82422-1.5801.0672-.50202.10156-1.016.10156-1.543.00001-.52391-.03436-1.04-.10156-1.543-.16197-1.0521-.43554-1.5801-.82422-1.5801h-14.924zm-58.291 6.2793c1.0989 0 2.0193.49244 2.7617 1.4746.74331.98339 1.1152 2.3913 1.1152 4.2207 0 1.8309-.35955 3.2363-1.0801 4.2188-.72053.98612-1.6597 1.4785-2.8145 1.4785-1.1554 0-2.0859-.48441-2.7949-1.459-.71019-.97154-1.0644-2.3663-1.0644-4.1875 0-1.8173.37148-3.2302 1.1133-4.2363.74574-1.0053 1.6663-1.5098 2.7637-1.5098zm45.504 0c1.0989 0 2.0181.49244 2.7617 1.4746.74331.98339 1.1152 2.3913 1.1152 4.2207 0 1.8309-.3612 3.2363-1.082 4.2188-.71961.98612-1.6574 1.4785-2.8125 1.4785-1.1554 0-2.0888-.48441-2.7969-1.459-.70806-.97154-1.0625-2.3663-1.0625-4.1875 0-1.8173.37179-3.2302 1.1133-4.2363.74453-1.0053 1.666-1.5098 2.7637-1.5098zm-24.977.23828h.34375c1.4638 0 2.5334.33466 3.209.99805.6722.66157 1.0098 2.0859 1.0098 4.2715 0 2.1847-.32289 3.7447-.97656 4.6816-.65214.9378-1.6059 1.4082-2.8652 1.4082-.34218 0-.54909-.063339-.61719-.18945-.06873-.12672-.10352-.42897-.10352-.9082v-10.262z" fill="#fff"/><path d="m137.91 48.551v1.2109h.85938v-1.2109zm-52.396.58984c-.99736 0-1.7963.32424-2.3926.96484-.59745.64576-.89453 1.5712-.89453 2.7773v3.0742c0 1.2329.31639 2.1765.94727 2.832.6333.66066 1.467.98828 2.5039.98828.78586 0 1.4321-.16147 1.9414-.48633.50993-.32273.8592-.67938 1.0488-1.0684v-3.6875h-3.0059v.74805h2.1465v2.6934c-.13766.30115-.38143.55386-.73242.76172-.34978.2109-.8171.31445-1.3984.31445-.79619 0-1.4265-.2632-1.8945-.78711-.46799-.52786-.70312-1.2936-.70312-2.2988v-3.0918c0-.96941.21778-1.7078.65234-2.2168.43578-.51023 1.0297-.76367 1.7812-.76367.74271 0 1.3056.19019 1.6836.56641.38017.37925.58276.91542.61133 1.6113h.79492l.013672-.041016c-.024311-.90802-.30456-1.6179-.83789-2.127-.53484-.50719-1.2907-.76367-2.2656-.76367zm7.6133 2.6641c-.719 0-1.3111.22524-1.7715.67773-.46222.45371-.68069.96571-.6582 1.5449l.013672.041015.79688.007813c0-.42696.14768-.78487.44336-1.0781.2966-.29508.67455-.44141 1.1328-.44141.4926 0 .87459.15388 1.1523.45898.27198.30906.41016.73655.41016 1.2793v.94531h-1.3418c-.85666 0-1.5379.21084-2.0391.63477-.50142.42392-.75195.99502-.75195 1.707 0 .67372.17358 1.2075.51758 1.6035.34613.39445.83497.5918 1.4707.5918.45462 0 .86723-.12355 1.2383-.37305.37166-.24767.67317-.56424.90625-.94531 0 .17413.01089.34527.03125.51758.02097.16927.053163.38614.095703.65234h.88867c-.062302-.24767-.10234-.49621-.12695-.75391-.02401-.25436-.037109-.52051-.037109-.79492v-3.7676c0-.80622-.21809-1.4265-.65234-1.8613-.43669-.43061-1.0083-.64648-1.7188-.64648zm7.1152 0c-.45462 0-.85109.11505-1.1875.3457-.33519.23369-.60486.56357-.80664.99023l-.074219-1.1934h-.75195v7.6816h.85352v-5.5293c.11791-.47346.31244-.84655.58594-1.1191.27168-.27107.63379-.4082 1.082-.4082.4689 0 .83314.19466 1.0957.58789.26378.39323.39258 1.0508.39258 1.9707v4.498h.85351v-4.6211-.19922c.0623-.64455.23396-1.1785.51172-1.6055.27927-.42696.66855-.63672 1.166-.63672.47285 0 .83879.19223 1.0938.57422.25345.38138.38281 1.0443.38281 1.9863v4.502h.85742v-4.4863c0-1.1332-.18468-1.9728-.55664-2.5195-.37044-.54548-.89268-.81836-1.5664-.81836-.48897 0-.91182.1465-1.2598.43945-.34796.29234-.61537.69589-.80469 1.207-.148-.55369-.38151-.966-.69726-1.2383-.31543-.2732-.70589-.4082-1.1699-.4082zm10.316 0c-.74423-.000001-1.3797.32125-1.9082.96094-.52725.64273-.78906 1.4505-.78906 2.4199v1.2754c0 .96758.26259 1.762.7871 2.3828.52604.62206 1.2032.93359 2.0312.93359.5157 0 .95833-.090281 1.3242-.26562.36679-.17626.66658-.41287.89844-.70703l-.34961-.60547c-.21728.27441-.4784.4836-.7832.63281-.3048.14586-.66987.2207-1.0898.2207-.60443 0-1.0864-.24489-1.4414-.74023-.35433-.49412-.53321-1.1138-.53321-1.8574v-.63867h4.3965v-.84375c0-.96667-.22381-1.7371-.66992-2.3105-.44519-.57253-1.0684-.85742-1.873-.85742zm9.4727 0c-.74423-.000001-1.3782.32125-1.9082.96094-.52603.64273-.79101 1.4505-.79101 2.4199v1.2754c0 .96758.26241 1.762.78906 2.3828.52512.62206 1.2028.93359 2.0312.93359.51601 0 .95639-.090281 1.3223-.26562.36741-.17626.66822-.41287.90039-.70703l-.34766-.60547c-.21972.27441-.4811.4836-.78711.63281-.30389.14586-.66639.2207-1.0879.2207-.60656 0-1.0883-.24489-1.4414-.74023-.35646-.49412-.5332-1.1138-.5332-1.8574v-.63867h4.3945v-.84375c0-.96667-.22338-1.7371-.66797-2.3105-.44398-.57253-1.0699-.85742-1.873-.85742zm6.8672 0c-.45614 0-.85274.12451-1.1894.36914-.33975.24342-.60962.5923-.81445 1.043l-.07031-1.2695h-.76172v7.6816h.85351v-5.4824c.14617-.47923.36569-.85918.66016-1.1445.29325-.28809.65767-.42969 1.0938-.42969.48622 0 .85922.17765 1.1133.5332.25557.35555.38477.96807.38477 1.8457v4.6777h.85937v-4.6855c0-1.0736-.18381-1.866-.55273-2.375-.36497-.50993-.89-.76367-1.5762-.76367zm6.2539 0c-.77674 0-1.386.32888-1.8242.98437-.44186.65883-.66211 1.5326-.66211 2.6211l.00196 1.0508c0 1.0031.21834 1.8072.65625 2.4102.43699.60413 1.0429.90625 1.8144.90625.41602 0 .78387-.091234 1.0996-.27539.31695-.18324.58484-.4491.80273-.79492v.92969c0 .75881-.14785 1.3303-.4414 1.7266-.29235.39111-.74301.58789-1.3535.58789-.30359 0-.59763-.04082-.88086-.125-.28565-.081443-.54279-.19619-.77344-.3457l-.23632.74805c.27047.15164.57916.27315.92773.36523.34795.092075.67388.13867.97656.13867.84208 0 1.494-.27297 1.9531-.81055.45857-.53971.68554-1.3009.68554-2.2852v-7.6895h-.72265l-.08399 1.0684c-.21485-.38533-.48269-.68758-.80664-.89453-.32334-.2109-.70159-.31641-1.1328-.31641zm10.467 0c-.45401 0-.85062.12451-1.1895.36914-.33914.24342-.60902.5923-.81445 1.043l-.07031-1.2695h-.75977v7.6816h.85352v-5.4824c.14556-.47923.3663-.85918.66016-1.1445.29295-.28809.65797-.42969 1.0937-.42969.48775 0 .85711.17765 1.1133.5332.25496.35555.38476.96807.38476 1.8457v4.6777h.85742v-4.6855c0-1.0736-.18081-1.866-.54882-2.375-.36588-.50993-.8939-.76367-1.5801-.76367zm6.4043 0c-.74271-.000001-1.3778.32125-1.9062.96094-.52724.64273-.79101 1.4505-.79101 2.4199v1.2754c0 .96758.26334 1.762.78906 2.3828.52361.62206 1.2007.93359 2.0312.93359.5154 0 .9567-.090281 1.3223-.26562.3668-.17626.6667-.41287.90039-.70703l-.34961-.60547c-.2194.27441-.47958.4836-.78711.63281-.30359.14586-.66597.2207-1.0859.2207-.60717 0-1.089-.24489-1.4434-.74023-.35464-.49412-.5332-1.1138-.5332-1.8574v-.63867h4.3965v-.84375c0-.96667-.22369-1.7371-.66797-2.3105-.44551-.57253-1.0709-.85742-1.875-.85742zm-12.113.14258v7.6816h.85938v-7.6816zm-27.352.60938c.53029 0 .9445.20789 1.2441.62695.29781.41876.44531.94616.44531 1.5801v.33008h-3.543c.01429-.71688.19281-1.3186.53711-1.8066.34401-.48622.78217-.73047 1.3164-.73047zm9.4727 0c.52998 0 .94406.20789 1.2422.62695.29963.41876.44727.94616.44727 1.5801v.33008h-3.543c.0155-.71688.19298-1.3186.53516-1.8066.3437-.48622.7826-.73047 1.3184-.73047zm29.992 0c.53089 0 .94602.20789 1.2441.62695.29902.41876.44532.94616.44532 1.5801v.33008h-3.543c.01519-.71688.19402-1.3186.53711-1.8066.34218-.48622.78064-.73047 1.3164-.73047zm-16.686.015625c.42119 0 .77033.1246 1.0469.375.27684.25466.4967.58706.65625.99609v3.8047c-.16593.39718-.39.70872-.67383.93359-.28475.22488-.63089.33594-1.043.33594-.6014 0-1.0536-.22975-1.3496-.69531-.29964-.4613-.44727-1.0819-.44727-1.8613v-1.0508c0-.84177.15149-1.527.45508-2.0527.30146-.52482.75528-.78516 1.3555-.78516zm-40.057 3.3281h1.3652v1.6621c-.15286.42089-.40964.76752-.77734 1.041-.3671.27228-.78783.40625-1.2598.40625-.39262 0-.69782-.12824-.91602-.38867-.2185-.25952-.32617-.59591-.32617-1.0059 0-.48531.17262-.89402.52148-1.2207.34795-.32881.81215-.49414 1.3926-.49414z" fill="#e0e0e0"/><path d="m0 0s-.325 1.994-.515 1.976l-36.182-3.491c-2.879-.278-5.115-2.574-5.317-5.459l-.994-14.247-27.992-1.997-1.904 12.912c-.424 2.872-2.932 5.037-5.835 5.037h-38.188c-2.902 0-5.41-2.165-5.834-5.037l-1.905-12.912-27.992 1.997-.994 14.247c-.202 2.886-2.438 5.182-5.317 5.46l-36.2 3.49c-.187.018-.324-1.978-.511-1.978l-.049-7.83 30.658-4.944 1.004-14.374c.203-2.91 2.551-5.263 5.463-5.472l38.551-2.75c.146-.01.29-.016.434-.016 2.897 0 5.401 2.166 5.825 5.038l1.959 13.286h28.005l1.959-13.286c.423-2.871 2.93-5.037 5.831-5.037.142 0 .284.005.423.015l38.556 2.75c2.911.209 5.26 2.562 5.463 5.472l1.003 14.374 30.645 4.966z" fill="#fff" transform="matrix(.30389749 0 0 -.30389749 63.620953 46.532114)"/><path d="m0 0v-47.514-6.035-5.492c.108-.001.216-.005.323-.015l36.196-3.49c1.896-.183 3.382-1.709 3.514-3.609l1.116-15.978 31.574-2.253 2.175 14.747c.282 1.912 1.922 3.329 3.856 3.329h38.188c1.933 0 3.573-1.417 3.855-3.329l2.175-14.747 31.575 2.253 1.115 15.978c.133 1.9 1.618 3.425 3.514 3.609l36.182 3.49c.107.01.214.014.322.015v4.711l.015.005v54.325c5.09692 6.4164715 9.92323 13.494208 13.621 19.449-5.651 9.62-12.575 18.217-19.976 26.182-6.864-3.455-13.531-7.369-19.828-11.534-3.151 3.132-6.7 5.694-10.186 8.372-3.425 2.751-7.285 4.768-10.946 7.118 1.09 8.117 1.629 16.108 1.846 24.448-9.446 4.754-19.519 7.906-29.708 10.17-4.068-6.837-7.788-14.241-11.028-21.479-3.842.642-7.702.88-11.567.926v.006c-.027 0-.052-.006-.075-.006-.024 0-.049.006-.073.006v-.006c-3.872-.046-7.729-.284-11.572-.926-3.238 7.238-6.956 14.642-11.03 21.479-10.184-2.264-20.258-5.416-29.703-10.17.216-8.34.755-16.331 1.848-24.448-3.668-2.35-7.523-4.367-10.949-7.118-3.481-2.678-7.036-5.24-10.188-8.372-6.297 4.165-12.962 8.079-19.828 11.534-7.401-7.965-14.321-16.562-19.974-26.182 4.4426579-6.973692 9.2079702-13.9828876 13.621-19.449z" fill="#478cbf" transform="matrix(.30389749 0 0 -.30389749 4.154146 28.589689)"/><path d="m0 0-1.121-16.063c-.135-1.936-1.675-3.477-3.611-3.616l-38.555-2.751c-.094-.007-.188-.01-.281-.01-1.916 0-3.569 1.406-3.852 3.33l-2.211 14.994h-31.459l-2.211-14.994c-.297-2.018-2.101-3.469-4.133-3.32l-38.555 2.751c-1.936.139-3.476 1.68-3.611 3.616l-1.121 16.063-32.547 3.138c.015-3.498.06-7.33.06-8.093 0-34.374 43.605-50.896 97.781-51.086h.066.067c54.176.19 97.766 16.712 97.766 51.086 0 .777.047 4.593.063 8.093z" fill="#478cbf" transform="matrix(.30389749 0 0 -.30389749 53.752732 49.859089)"/><path d="m0 0c0-12.052-9.765-21.815-21.813-21.815-12.042 0-21.81 9.763-21.81 21.815 0 12.044 9.768 21.802 21.81 21.802 12.048 0 21.813-9.758 21.813-21.802" fill="#fff" transform="matrix(.30389749 0 0 -.30389749 24.925648 35.87311)"/><path d="m0 0c0-7.994-6.479-14.473-14.479-14.473-7.996 0-14.479 6.479-14.479 14.473s6.483 14.479 14.479 14.479c8 0 14.479-6.485 14.479-14.479" fill="#414042" transform="matrix(.30389749 0 0 -.30389749 23.330605 36.266305)"/><path d="m0 0c-3.878 0-7.021 2.858-7.021 6.381v20.081c0 3.52 3.143 6.381 7.021 6.381s7.028-2.861 7.028-6.381v-20.081c0-3.523-3.15-6.381-7.028-6.381" fill="#fff" transform="matrix(.30389749 0 0 -.30389749 33.889273 43.105751)"/><path d="m0 0c0-12.052 9.765-21.815 21.815-21.815 12.041 0 21.808 9.763 21.808 21.815 0 12.044-9.767 21.802-21.808 21.802-12.05 0-21.815-9.758-21.815-21.802" fill="#fff" transform="matrix(.30389749 0 0 -.30389749 42.854008 35.87311)"/><path d="m0 0c0-7.994 6.477-14.473 14.471-14.473 8.002 0 14.479 6.479 14.479 14.473s-6.477 14.479-14.479 14.479c-7.994 0-14.471-6.485-14.471-14.479" fill="#414042" transform="matrix(.30389749 0 0 -.30389749 44.449454 36.266305)"/></svg> diff --git a/editor/icons/NodeDisabled.svg b/editor/icons/NodeDisabled.svg new file mode 100644 index 0000000000..b2d51fc4fb --- /dev/null +++ b/editor/icons/NodeDisabled.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2a6 6 0 0 0 -6 6 6 6 0 0 0 6 6 6 6 0 0 0 6-6 6 6 0 0 0 -6-6zm0 2a4 4 0 0 1 4 4 4 4 0 0 1 -4 4 4 4 0 0 1 -4-4 4 4 0 0 1 4-4z" fill="#999"/></svg> diff --git a/editor/import/editor_import_collada.cpp b/editor/import/editor_import_collada.cpp index 50b13673fa..080393e570 100644 --- a/editor/import/editor_import_collada.cpp +++ b/editor/import/editor_import_collada.cpp @@ -79,6 +79,9 @@ struct ColladaImport { Vector<int> valid_animated_properties; Map<String, bool> bones_with_animation; + Set<String> mesh_unique_names; + Set<String> material_unique_names; + Error _populate_skeleton(Skeleton3D *p_skeleton, Collada::Node *p_node, int &r_bone, int p_parent); Error _create_scene_skeletons(Collada::Node *p_node); Error _create_scene(Collada::Node *p_node, Node3D *p_parent); @@ -326,12 +329,25 @@ Error ColladaImport::_create_material(const String &p_target) { Ref<StandardMaterial3D> material = memnew(StandardMaterial3D); + String base_name; if (src_mat.name != "") { - material->set_name(src_mat.name); + base_name = src_mat.name; } else if (effect.name != "") { - material->set_name(effect.name); + base_name = effect.name; + } else { + base_name = "Material"; } + String name = base_name; + int counter = 2; + while (material_unique_names.has(name)) { + name = base_name + itos(counter++); + } + + material_unique_names.insert(name); + + material->set_name(name); + // DIFFUSE if (effect.diffuse.texture != "") { @@ -681,7 +697,8 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<EditorSceneImpor int vertex_index = p.indices[src + vertex_ofs]; //used for index field (later used by controllers) int vertex_pos = (vertex_src->stride ? vertex_src->stride : 3) * vertex_index; - ERR_FAIL_INDEX_V(vertex_pos, vertex_src->array.size(), ERR_INVALID_DATA); + ERR_FAIL_INDEX_V(vertex_pos + 0, vertex_src->array.size(), ERR_INVALID_DATA); + ERR_FAIL_INDEX_V(vertex_pos + 2, vertex_src->array.size(), ERR_INVALID_DATA); vertex.vertex = Vector3(vertex_src->array[vertex_pos + 0], vertex_src->array[vertex_pos + 1], vertex_src->array[vertex_pos + 2]); if (pre_weights.has(vertex_index)) { @@ -690,16 +707,19 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<EditorSceneImpor if (normal_src) { int normal_pos = (normal_src->stride ? normal_src->stride : 3) * p.indices[src + normal_ofs]; - ERR_FAIL_INDEX_V(normal_pos, normal_src->array.size(), ERR_INVALID_DATA); + ERR_FAIL_INDEX_V(normal_pos + 0, normal_src->array.size(), ERR_INVALID_DATA); + ERR_FAIL_INDEX_V(normal_pos + 2, normal_src->array.size(), ERR_INVALID_DATA); vertex.normal = Vector3(normal_src->array[normal_pos + 0], normal_src->array[normal_pos + 1], normal_src->array[normal_pos + 2]); if (tangent_src && binormal_src) { int binormal_pos = (binormal_src->stride ? binormal_src->stride : 3) * p.indices[src + binormal_ofs]; - ERR_FAIL_INDEX_V(binormal_pos, binormal_src->array.size(), ERR_INVALID_DATA); + ERR_FAIL_INDEX_V(binormal_pos + 0, binormal_src->array.size(), ERR_INVALID_DATA); + ERR_FAIL_INDEX_V(binormal_pos + 2, binormal_src->array.size(), ERR_INVALID_DATA); Vector3 binormal = Vector3(binormal_src->array[binormal_pos + 0], binormal_src->array[binormal_pos + 1], binormal_src->array[binormal_pos + 2]); int tangent_pos = (tangent_src->stride ? tangent_src->stride : 3) * p.indices[src + tangent_ofs]; - ERR_FAIL_INDEX_V(tangent_pos, tangent_src->array.size(), ERR_INVALID_DATA); + ERR_FAIL_INDEX_V(tangent_pos + 0, tangent_src->array.size(), ERR_INVALID_DATA); + ERR_FAIL_INDEX_V(tangent_pos + 2, tangent_src->array.size(), ERR_INVALID_DATA); Vector3 tangent = Vector3(tangent_src->array[tangent_pos + 0], tangent_src->array[tangent_pos + 1], tangent_src->array[tangent_pos + 2]); vertex.tangent.normal = tangent; @@ -709,19 +729,22 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<EditorSceneImpor if (uv_src) { int uv_pos = (uv_src->stride ? uv_src->stride : 2) * p.indices[src + uv_ofs]; - ERR_FAIL_INDEX_V(uv_pos, uv_src->array.size(), ERR_INVALID_DATA); + ERR_FAIL_INDEX_V(uv_pos + 0, uv_src->array.size(), ERR_INVALID_DATA); + ERR_FAIL_INDEX_V(uv_pos + 1, uv_src->array.size(), ERR_INVALID_DATA); vertex.uv = Vector3(uv_src->array[uv_pos + 0], 1.0 - uv_src->array[uv_pos + 1], 0); } if (uv2_src) { int uv2_pos = (uv2_src->stride ? uv2_src->stride : 2) * p.indices[src + uv2_ofs]; - ERR_FAIL_INDEX_V(uv2_pos, uv2_src->array.size(), ERR_INVALID_DATA); + ERR_FAIL_INDEX_V(uv2_pos + 0, uv2_src->array.size(), ERR_INVALID_DATA); + ERR_FAIL_INDEX_V(uv2_pos + 1, uv2_src->array.size(), ERR_INVALID_DATA); vertex.uv2 = Vector3(uv2_src->array[uv2_pos + 0], 1.0 - uv2_src->array[uv2_pos + 1], 0); } if (color_src) { int color_pos = (color_src->stride ? color_src->stride : 3) * p.indices[src + color_ofs]; // colors are RGB in collada.. - ERR_FAIL_INDEX_V(color_pos, color_src->array.size(), ERR_INVALID_DATA); + ERR_FAIL_INDEX_V(color_pos + 0, color_src->array.size(), ERR_INVALID_DATA); + ERR_FAIL_INDEX_V(color_pos + ((color_src->stride > 3) ? 3 : 2), color_src->array.size(), ERR_INVALID_DATA); vertex.color = Color(color_src->array[color_pos + 0], color_src->array[color_pos + 1], color_src->array[color_pos + 2], (color_src->stride > 3) ? color_src->array[color_pos + 3] : 1.0); } @@ -1121,7 +1144,22 @@ Error ColladaImport::_create_resources(Collada::Node *p_node, bool p_use_compres ERR_FAIL_COND_V(!collada.state.mesh_data_map.has(meshid), ERR_INVALID_DATA); mesh = Ref<EditorSceneImporterMesh>(memnew(EditorSceneImporterMesh)); const Collada::MeshData &meshdata = collada.state.mesh_data_map[meshid]; - mesh->set_name(meshdata.name); + String name = meshdata.name; + if (name == "") { + name = "Mesh"; + } + int counter = 2; + while (mesh_unique_names.has(name)) { + name = meshdata.name; + if (name == "") { + name = "Mesh"; + } + name += itos(counter++); + } + + mesh_unique_names.insert(name); + + mesh->set_name(name); Error err = _create_mesh_surfaces(morphs.size() == 0, mesh, ng2->material_map, meshdata, apply_xform, bone_remap, skin, morph, morphs, p_use_compression, use_mesh_builtin_materials); ERR_FAIL_COND_V_MSG(err, err, "Cannot create mesh surface."); @@ -1638,16 +1676,23 @@ void EditorSceneImporterCollada::get_extensions(List<String> *r_extensions) cons } Node *EditorSceneImporterCollada::import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err) { + if (r_err) { + *r_err = OK; + } ColladaImport state; uint32_t flags = Collada::IMPORT_FLAG_SCENE; if (p_flags & IMPORT_ANIMATION) { flags |= Collada::IMPORT_FLAG_ANIMATION; } - state.use_mesh_builtin_materials = !(p_flags & IMPORT_MATERIALS_IN_INSTANCES); + state.use_mesh_builtin_materials = true; state.bake_fps = p_bake_fps; - Error err = state.load(p_path, flags, p_flags & EditorSceneImporter::IMPORT_GENERATE_TANGENT_ARRAYS, p_flags & EditorSceneImporter::IMPORT_USE_COMPRESSION); + Error err = state.load(p_path, flags, p_flags & EditorSceneImporter::IMPORT_GENERATE_TANGENT_ARRAYS, 0); + + if (r_err) { + *r_err = err; + } ERR_FAIL_COND_V_MSG(err != OK, nullptr, "Cannot load scene from file '" + p_path + "'."); @@ -1667,7 +1712,7 @@ Node *EditorSceneImporterCollada::import_scene(const String &p_path, uint32_t p_ } if (p_flags & IMPORT_ANIMATION) { - state.create_animations(p_flags & IMPORT_ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS, p_flags & EditorSceneImporter::IMPORT_ANIMATION_KEEP_VALUE_TRACKS); + state.create_animations(true, true); AnimationPlayer *ap = memnew(AnimationPlayer); for (int i = 0; i < state.animations.size(); i++) { String name; @@ -1677,12 +1722,6 @@ Node *EditorSceneImporterCollada::import_scene(const String &p_path, uint32_t p_ name = state.animations[i]->get_name(); } - if (p_flags & IMPORT_ANIMATION_DETECT_LOOP) { - if (name.begins_with("loop") || name.ends_with("loop") || name.begins_with("cycle") || name.ends_with("cycle")) { - state.animations.write[i]->set_loop(true); - } - } - ap->add_animation(name, state.animations[i]); } state.scene->add_child(ap); @@ -1700,7 +1739,7 @@ Ref<Animation> EditorSceneImporterCollada::import_animation(const String &p_path Error err = state.load(p_path, Collada::IMPORT_FLAG_ANIMATION, p_flags & EditorSceneImporter::IMPORT_GENERATE_TANGENT_ARRAYS); ERR_FAIL_COND_V_MSG(err != OK, RES(), "Cannot load animation from file '" + p_path + "'."); - state.create_animations(p_flags & EditorSceneImporter::IMPORT_ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS, p_flags & EditorSceneImporter::IMPORT_ANIMATION_KEEP_VALUE_TRACKS); + state.create_animations(true, true); if (state.scene) { memdelete(state.scene); } @@ -1709,12 +1748,6 @@ Ref<Animation> EditorSceneImporterCollada::import_animation(const String &p_path return Ref<Animation>(); } Ref<Animation> anim = state.animations[0]; - String base = p_path.get_basename().to_lower(); - if (p_flags & IMPORT_ANIMATION_DETECT_LOOP) { - if (base.begins_with("loop") || base.ends_with("loop") || base.begins_with("cycle") || base.ends_with("cycle")) { - anim->set_loop(true); - } - } return anim; } diff --git a/editor/import/resource_importer_csv_translation.cpp b/editor/import/resource_importer_csv_translation.cpp index 7ea39ab3ef..4a4d9d8f06 100644 --- a/editor/import/resource_importer_csv_translation.cpp +++ b/editor/import/resource_importer_csv_translation.cpp @@ -32,7 +32,7 @@ #include "core/io/resource_saver.h" #include "core/os/file_access.h" -#include "core/string/compressed_translation.h" +#include "core/string/optimized_translation.h" #include "core/string/translation.h" String ResourceImporterCSVTranslation::get_importer_name() const { @@ -126,7 +126,7 @@ Error ResourceImporterCSVTranslation::import(const String &p_source_file, const Ref<Translation> xlt = translations[i]; if (compress) { - Ref<PHashTranslation> cxl = memnew(PHashTranslation); + Ref<OptimizedTranslation> cxl = memnew(OptimizedTranslation); cxl->generate(xlt); xlt = cxl; } diff --git a/editor/import/resource_importer_layered_texture.cpp b/editor/import/resource_importer_layered_texture.cpp index 3139ef5146..6d2215c379 100644 --- a/editor/import/resource_importer_layered_texture.cpp +++ b/editor/import/resource_importer_layered_texture.cpp @@ -391,8 +391,8 @@ Error ResourceImporterLayeredTexture::import(const String &p_source_file, const bool ok_on_pc = false; bool is_hdr = (image->get_format() >= Image::FORMAT_RF && image->get_format() <= Image::FORMAT_RGBE9995); bool is_ldr = (image->get_format() >= Image::FORMAT_L8 && image->get_format() <= Image::FORMAT_RGB565); - bool can_bptc = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_bptc"); - bool can_s3tc = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_s3tc"); + bool can_bptc = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_bptc"); + bool can_s3tc = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_s3tc"); if (can_bptc) { formats_imported.push_back("bptc"); //needs to be aded anyway @@ -447,13 +447,13 @@ Error ResourceImporterLayeredTexture::import(const String &p_source_file, const ok_on_pc = true; } - if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc2")) { + if (ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc2")) { _save_tex(slices, p_save_path + ".etc2." + extension, compress_mode, lossy, Image::COMPRESS_ETC2, csource, used_channels, mipmaps, true); r_platform_variants->push_back("etc2"); formats_imported.push_back("etc2"); } - if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_pvrtc")) { + if (ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_pvrtc")) { _save_tex(slices, p_save_path + ".etc2." + extension, compress_mode, lossy, Image::COMPRESS_ETC2, csource, used_channels, mipmaps, true); r_platform_variants->push_back("pvrtc"); formats_imported.push_back("pvrtc"); @@ -492,7 +492,7 @@ String ResourceImporterLayeredTexture::get_import_settings_string() const { int index = 0; while (compression_formats[index]) { - String setting_path = "rendering/vram_compression/import_" + String(compression_formats[index]); + String setting_path = "rendering/textures/vram_compression/import_" + String(compression_formats[index]); bool test = ProjectSettings::get_singleton()->get(setting_path); if (test) { s += String(compression_formats[index]); @@ -524,7 +524,7 @@ bool ResourceImporterLayeredTexture::are_import_settings_valid(const String &p_p int index = 0; bool valid = true; while (compression_formats[index]) { - String setting_path = "rendering/vram_compression/import_" + String(compression_formats[index]); + String setting_path = "rendering/textures/vram_compression/import_" + String(compression_formats[index]); bool test = ProjectSettings::get_singleton()->get(setting_path); if (test) { if (formats_imported.find(compression_formats[index]) == -1) { diff --git a/editor/import/resource_importer_obj.cpp b/editor/import/resource_importer_obj.cpp index 9111252943..5c522e3176 100644 --- a/editor/import/resource_importer_obj.cpp +++ b/editor/import/resource_importer_obj.cpp @@ -427,7 +427,7 @@ static Error _parse_obj(const String &p_path, List<Ref<Mesh>> &r_meshes, bool p_ Node *EditorOBJImporter::import_scene(const String &p_path, uint32_t p_flags, int p_bake_fps, List<String> *r_missing_deps, Error *r_err) { List<Ref<Mesh>> meshes; - Error err = _parse_obj(p_path, meshes, false, p_flags & IMPORT_GENERATE_TANGENT_ARRAYS, p_flags & IMPORT_USE_COMPRESSION, Vector3(1, 1, 1), Vector3(0, 0, 0), r_missing_deps); + Error err = _parse_obj(p_path, meshes, false, p_flags & IMPORT_GENERATE_TANGENT_ARRAYS, 0, Vector3(1, 1, 1), Vector3(0, 0, 0), r_missing_deps); if (err != OK) { if (r_err) { diff --git a/editor/import/resource_importer_scene.cpp b/editor/import/resource_importer_scene.cpp index 9944712931..c6ef9b61d7 100644 --- a/editor/import/resource_importer_scene.cpp +++ b/editor/import/resource_importer_scene.cpp @@ -32,10 +32,12 @@ #include "core/io/resource_saver.h" #include "editor/editor_node.h" +#include "editor/import/scene_import_settings.h" #include "editor/import/scene_importer_mesh_node_3d.h" +#include "scene/3d/area_3d.h" #include "scene/3d/collision_shape_3d.h" #include "scene/3d/mesh_instance_3d.h" -#include "scene/3d/navigation_3d.h" +#include "scene/3d/navigation_region_3d.h" #include "scene/3d/physics_body_3d.h" #include "scene/3d/vehicle_body_3d.h" #include "scene/animation/animation_player.h" @@ -111,20 +113,14 @@ void EditorSceneImporter::_bind_methods() { BIND_CONSTANT(IMPORT_SCENE); BIND_CONSTANT(IMPORT_ANIMATION); - BIND_CONSTANT(IMPORT_ANIMATION_DETECT_LOOP); - BIND_CONSTANT(IMPORT_ANIMATION_OPTIMIZE); - BIND_CONSTANT(IMPORT_ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS); - BIND_CONSTANT(IMPORT_ANIMATION_KEEP_VALUE_TRACKS); - BIND_CONSTANT(IMPORT_GENERATE_TANGENT_ARRAYS); BIND_CONSTANT(IMPORT_FAIL_ON_MISSING_DEPENDENCIES); - BIND_CONSTANT(IMPORT_MATERIALS_IN_INSTANCES); - BIND_CONSTANT(IMPORT_USE_COMPRESSION); + BIND_CONSTANT(IMPORT_GENERATE_TANGENT_ARRAYS); + BIND_CONSTANT(IMPORT_USE_NAMED_SKIN_BINDS); } ///////////////////////////////// void EditorScenePostImport::_bind_methods() { BIND_VMETHOD(MethodInfo(Variant::OBJECT, "post_import", PropertyInfo(Variant::OBJECT, "scene"))); - ClassDB::bind_method(D_METHOD("get_source_folder"), &EditorScenePostImport::get_source_folder); ClassDB::bind_method(D_METHOD("get_source_file"), &EditorScenePostImport::get_source_file); } @@ -136,16 +132,11 @@ Node *EditorScenePostImport::post_import(Node *p_scene) { return p_scene; } -String EditorScenePostImport::get_source_folder() const { - return source_folder; -} - String EditorScenePostImport::get_source_file() const { return source_file; } -void EditorScenePostImport::init(const String &p_source_folder, const String &p_source_file) { - source_folder = p_source_folder; +void EditorScenePostImport::init(const String &p_source_file) { source_file = p_source_file; } @@ -183,29 +174,9 @@ bool ResourceImporterScene::get_option_visibility(const String &p_option, const if (p_option != "animation/import" && !bool(p_options["animation/import"])) { return false; } - - if (p_option == "animation/keep_custom_tracks" && int(p_options["animation/storage"]) == 0) { - return false; - } - - if (p_option.begins_with("animation/optimizer/") && p_option != "animation/optimizer/enabled" && !bool(p_options["animation/optimizer/enabled"])) { - return false; - } - - if (p_option.begins_with("animation/clip_")) { - int max_clip = p_options["animation/clips/amount"]; - int clip = p_option.get_slice("/", 1).get_slice("_", 1).to_int() - 1; - if (clip >= max_clip) { - return false; - } - } - } - - if (p_option == "materials/keep_on_reimport" && int(p_options["materials/storage"]) == 0) { - return false; } - if (p_option == "meshes/lightmap_texel_size" && int(p_options["meshes/light_baking"]) < 2) { + if (p_option == "meshes/lightmap_texel_size" && int(p_options["meshes/light_baking"]) < 3) { return false; } @@ -213,34 +184,11 @@ bool ResourceImporterScene::get_option_visibility(const String &p_option, const } int ResourceImporterScene::get_preset_count() const { - return PRESET_MAX; + return 0; } String ResourceImporterScene::get_preset_name(int p_idx) const { - switch (p_idx) { - case PRESET_SINGLE_SCENE: - return TTR("Import as Single Scene"); - case PRESET_SEPARATE_ANIMATIONS: - return TTR("Import with Separate Animations"); - case PRESET_SEPARATE_MATERIALS: - return TTR("Import with Separate Materials"); - case PRESET_SEPARATE_MESHES: - return TTR("Import with Separate Objects"); - case PRESET_SEPARATE_MESHES_AND_MATERIALS: - return TTR("Import with Separate Objects+Materials"); - case PRESET_SEPARATE_MESHES_AND_ANIMATIONS: - return TTR("Import with Separate Objects+Animations"); - case PRESET_SEPARATE_MATERIALS_AND_ANIMATIONS: - return TTR("Import with Separate Materials+Animations"); - case PRESET_SEPARATE_MESHES_MATERIALS_AND_ANIMATIONS: - return TTR("Import with Separate Objects+Materials+Animations"); - case PRESET_MULTIPLE_SCENES: - return TTR("Import as Multiple Scenes"); - case PRESET_MULTIPLE_SCENES_AND_MATERIALS: - return TTR("Import as Multiple Scenes+Materials"); - } - - return ""; + return String(); } static bool _teststr(const String &p_what, const String &p_str) { @@ -299,10 +247,24 @@ static void _gen_shape_list(const Ref<Mesh> &mesh, List<Ref<Shape3D>> &r_shape_l } } -Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>, List<Ref<Shape3D>>> &collision_map, LightBakeMode p_light_bake_mode) { +static void _pre_gen_shape_list(const Ref<EditorSceneImporterMesh> &mesh, List<Ref<Shape3D>> &r_shape_list, bool p_convex) { + if (!p_convex) { + Ref<Shape3D> shape = mesh->create_trimesh_shape(); + r_shape_list.push_back(shape); + } else { + Vector<Ref<Shape3D>> cd = mesh->convex_decompose(); + if (cd.size()) { + for (int i = 0; i < cd.size(); i++) { + r_shape_list.push_back(cd[i]); + } + } + } +} + +Node *ResourceImporterScene::_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<EditorSceneImporterMesh>, List<Ref<Shape3D>>> &collision_map) { // children first for (int i = 0; i < p_node->get_child_count(); i++) { - Node *r = _fix_node(p_node->get_child(i), p_root, collision_map, p_light_bake_mode); + Node *r = _pre_fix_node(p_node->get_child(i), p_root, collision_map); if (!r) { i--; //was erased } @@ -317,33 +279,29 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> return nullptr; } - if (Object::cast_to<MeshInstance3D>(p_node)) { - MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node); + if (Object::cast_to<EditorSceneImporterMeshNode3D>(p_node)) { + EditorSceneImporterMeshNode3D *mi = Object::cast_to<EditorSceneImporterMeshNode3D>(p_node); - Ref<ArrayMesh> m = mi->get_mesh(); + Ref<EditorSceneImporterMesh> m = mi->get_mesh(); if (m.is_valid()) { for (int i = 0; i < m->get_surface_count(); i++) { - Ref<StandardMaterial3D> mat = m->surface_get_material(i); + Ref<BaseMaterial3D> mat = m->get_surface_material(i); if (!mat.is_valid()) { continue; } if (_teststr(mat->get_name(), "alpha")) { - mat->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA); + mat->set_transparency(BaseMaterial3D::TRANSPARENCY_ALPHA); mat->set_name(_fixstr(mat->get_name(), "alpha")); } if (_teststr(mat->get_name(), "vcol")) { - mat->set_flag(StandardMaterial3D::FLAG_ALBEDO_FROM_VERTEX_COLOR, true); - mat->set_flag(StandardMaterial3D::FLAG_SRGB_VERTEX_COLOR, true); + mat->set_flag(BaseMaterial3D::FLAG_ALBEDO_FROM_VERTEX_COLOR, true); + mat->set_flag(BaseMaterial3D::FLAG_SRGB_VERTEX_COLOR, true); mat->set_name(_fixstr(mat->get_name(), "vcol")); } } } - - if (p_light_bake_mode != LIGHT_BAKE_DISABLED) { - mi->set_gi_mode(GeometryInstance3D::GI_MODE_BAKED); - } } if (Object::cast_to<AnimationPlayer>(p_node)) { @@ -367,6 +325,17 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> } } } + + String animname = E->get(); + const int loop_string_count = 3; + static const char *loop_strings[loop_string_count] = { "loops", "loop", "cycle" }; + for (int i = 0; i < loop_string_count; i++) { + if (_teststr(animname, loop_strings[i])) { + anim->set_loop(true); + animname = _fixstr(animname, loop_strings[i]); + ap->rename_animation(E->get(), animname); + } + } } } @@ -374,9 +343,9 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> if (isroot) { return p_node; } - MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node); + EditorSceneImporterMeshNode3D *mi = Object::cast_to<EditorSceneImporterMeshNode3D>(p_node); if (mi) { - Ref<Mesh> mesh = mi->get_mesh(); + Ref<EditorSceneImporterMesh> mesh = mi->get_mesh(); if (mesh.is_valid()) { List<Ref<Shape3D>> shapes; @@ -384,10 +353,10 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> if (collision_map.has(mesh)) { shapes = collision_map[mesh]; } else if (_teststr(name, "colonly")) { - _gen_shape_list(mesh, shapes, false); + _pre_gen_shape_list(mesh, shapes, false); collision_map[mesh] = shapes; } else if (_teststr(name, "convcolonly")) { - _gen_shape_list(mesh, shapes, true); + _pre_gen_shape_list(mesh, shapes, true); collision_map[mesh] = shapes; } @@ -407,16 +376,7 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> memdelete(p_node); p_node = col; - int idx = 0; - for (List<Ref<Shape3D>>::Element *E = shapes.front(); E; E = E->next()) { - CollisionShape3D *cshape = memnew(CollisionShape3D); - cshape->set_shape(E->get()); - col->add_child(cshape); - - cshape->set_name("shape" + itos(idx)); - cshape->set_owner(col->get_owner()); - idx++; - } + _add_shapes(col, shapes); } } @@ -433,34 +393,30 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> BoxShape3D *boxShape = memnew(BoxShape3D); boxShape->set_size(Vector3(2, 2, 2)); colshape->set_shape(boxShape); - colshape->set_name("BoxShape3D"); } else if (empty_draw_type == "SINGLE_ARROW") { RayShape3D *rayShape = memnew(RayShape3D); rayShape->set_length(1); colshape->set_shape(rayShape); - colshape->set_name("RayShape3D"); Object::cast_to<Node3D>(sb)->rotate_x(Math_PI / 2); } else if (empty_draw_type == "IMAGE") { WorldMarginShape3D *world_margin_shape = memnew(WorldMarginShape3D); colshape->set_shape(world_margin_shape); - colshape->set_name("WorldMarginShape3D"); } else { SphereShape3D *sphereShape = memnew(SphereShape3D); sphereShape->set_radius(1); colshape->set_shape(sphereShape); - colshape->set_name("SphereShape3D"); } sb->add_child(colshape); colshape->set_owner(sb->get_owner()); } - } else if (_teststr(name, "rigid") && Object::cast_to<MeshInstance3D>(p_node)) { + } else if (_teststr(name, "rigid") && Object::cast_to<EditorSceneImporterMeshNode3D>(p_node)) { if (isroot) { return p_node; } - MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node); - Ref<Mesh> mesh = mi->get_mesh(); + EditorSceneImporterMeshNode3D *mi = Object::cast_to<EditorSceneImporterMeshNode3D>(p_node); + Ref<EditorSceneImporterMesh> mesh = mi->get_mesh(); if (mesh.is_valid()) { List<Ref<Shape3D>> shapes; @@ -475,27 +431,17 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> p_node->replace_by(rigid_body); rigid_body->set_transform(mi->get_transform()); p_node = rigid_body; - mi->set_name("mesh"); mi->set_transform(Transform()); rigid_body->add_child(mi); mi->set_owner(rigid_body->get_owner()); - int idx = 0; - for (List<Ref<Shape3D>>::Element *E = shapes.front(); E; E = E->next()) { - CollisionShape3D *cshape = memnew(CollisionShape3D); - cshape->set_shape(E->get()); - rigid_body->add_child(cshape); - - cshape->set_name("shape" + itos(idx)); - cshape->set_owner(p_node->get_owner()); - idx++; - } + _add_shapes(rigid_body, shapes); } - } else if ((_teststr(name, "col") || (_teststr(name, "convcol"))) && Object::cast_to<MeshInstance3D>(p_node)) { - MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node); + } else if ((_teststr(name, "col") || (_teststr(name, "convcol"))) && Object::cast_to<EditorSceneImporterMeshNode3D>(p_node)) { + EditorSceneImporterMeshNode3D *mi = Object::cast_to<EditorSceneImporterMeshNode3D>(p_node); - Ref<Mesh> mesh = mi->get_mesh(); + Ref<EditorSceneImporterMesh> mesh = mi->get_mesh(); if (mesh.is_valid()) { List<Ref<Shape3D>> shapes; @@ -524,89 +470,38 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> if (shapes.size()) { StaticBody3D *col = memnew(StaticBody3D); - col->set_name("static_collision"); mi->add_child(col); col->set_owner(mi->get_owner()); - int idx = 0; - for (List<Ref<Shape3D>>::Element *E = shapes.front(); E; E = E->next()) { - CollisionShape3D *cshape = memnew(CollisionShape3D); - cshape->set_shape(E->get()); - col->add_child(cshape); - - cshape->set_name("shape" + itos(idx)); - cshape->set_owner(p_node->get_owner()); - - idx++; - } + _add_shapes(col, shapes); } } - } else if (_teststr(name, "navmesh") && Object::cast_to<MeshInstance3D>(p_node)) { + } else if (_teststr(name, "navmesh") && Object::cast_to<EditorSceneImporterMeshNode3D>(p_node)) { if (isroot) { return p_node; } - MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node); + EditorSceneImporterMeshNode3D *mi = Object::cast_to<EditorSceneImporterMeshNode3D>(p_node); - Ref<ArrayMesh> mesh = mi->get_mesh(); + Ref<EditorSceneImporterMesh> mesh = mi->get_mesh(); ERR_FAIL_COND_V(mesh.is_null(), nullptr); NavigationRegion3D *nmi = memnew(NavigationRegion3D); nmi->set_name(_fixstr(name, "navmesh")); - Ref<NavigationMesh> nmesh = memnew(NavigationMesh); - nmesh->create_from_mesh(mesh); + Ref<NavigationMesh> nmesh = mesh->create_navigation_mesh(); nmi->set_navigation_mesh(nmesh); Object::cast_to<Node3D>(nmi)->set_transform(mi->get_transform()); p_node->replace_by(nmi); memdelete(p_node); p_node = nmi; - } else if (_teststr(name, "vehicle")) { - if (isroot) { - return p_node; - } - - Node *owner = p_node->get_owner(); - Node3D *s = Object::cast_to<Node3D>(p_node); - VehicleBody3D *bv = memnew(VehicleBody3D); - String n = _fixstr(p_node->get_name(), "vehicle"); - bv->set_name(n); - p_node->replace_by(bv); - p_node->set_name(n); - bv->add_child(p_node); - bv->set_owner(owner); - p_node->set_owner(owner); - bv->set_transform(s->get_transform()); - s->set_transform(Transform()); - - p_node = bv; - - } else if (_teststr(name, "wheel")) { - if (isroot) { - return p_node; - } - Node *owner = p_node->get_owner(); - Node3D *s = Object::cast_to<Node3D>(p_node); - VehicleWheel3D *bv = memnew(VehicleWheel3D); - String n = _fixstr(p_node->get_name(), "wheel"); - bv->set_name(n); - p_node->replace_by(bv); - p_node->set_name(n); - bv->add_child(p_node); - bv->set_owner(owner); - p_node->set_owner(owner); - bv->set_transform(s->get_transform()); - s->set_transform(Transform()); - - p_node = bv; - - } else if (Object::cast_to<MeshInstance3D>(p_node)) { + } else if (Object::cast_to<EditorSceneImporterMeshNode3D>(p_node)) { //last attempt, maybe collision inside the mesh data - MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node); + EditorSceneImporterMeshNode3D *mi = Object::cast_to<EditorSceneImporterMeshNode3D>(p_node); - Ref<ArrayMesh> mesh = mi->get_mesh(); + Ref<EditorSceneImporterMesh> mesh = mi->get_mesh(); if (!mesh.is_null()) { List<Ref<Shape3D>> shapes; if (collision_map.has(mesh)) { @@ -623,19 +518,268 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> if (shapes.size()) { StaticBody3D *col = memnew(StaticBody3D); - col->set_name("static_collision"); p_node->add_child(col); col->set_owner(p_node->get_owner()); - int idx = 0; - for (List<Ref<Shape3D>>::Element *E = shapes.front(); E; E = E->next()) { - CollisionShape3D *cshape = memnew(CollisionShape3D); - cshape->set_shape(E->get()); - col->add_child(cshape); + _add_shapes(col, shapes); + } + } + } + + return p_node; +} + +Node *ResourceImporterScene::_post_fix_node(Node *p_node, Node *p_root, Map<Ref<EditorSceneImporterMesh>, List<Ref<Shape3D>>> &collision_map, Set<Ref<EditorSceneImporterMesh>> &r_scanned_meshes, const Dictionary &p_node_data, const Dictionary &p_material_data, const Dictionary &p_animation_data, float p_animation_fps) { + // children first + for (int i = 0; i < p_node->get_child_count(); i++) { + Node *r = _post_fix_node(p_node->get_child(i), p_root, collision_map, r_scanned_meshes, p_node_data, p_material_data, p_animation_data, p_animation_fps); + if (!r) { + i--; //was erased + } + } + + bool isroot = p_node == p_root; + + String import_id; + + if (p_node->has_meta("import_id")) { + import_id = p_node->get_meta("import_id"); + } else { + import_id = "PATH:" + p_root->get_path_to(p_node); + } + + Dictionary node_settings; + if (p_node_data.has(import_id)) { + node_settings = p_node_data[import_id]; + } + + if (!isroot && (node_settings.has("import/skip_import") && bool(node_settings["import/skip_import"]))) { + memdelete(p_node); + return nullptr; + } + + if (Object::cast_to<EditorSceneImporterMeshNode3D>(p_node)) { + EditorSceneImporterMeshNode3D *mi = Object::cast_to<EditorSceneImporterMeshNode3D>(p_node); + + Ref<EditorSceneImporterMesh> m = mi->get_mesh(); + + if (m.is_valid()) { + if (!r_scanned_meshes.has(m)) { + for (int i = 0; i < m->get_surface_count(); i++) { + Ref<Material> mat = m->get_surface_material(i); + if (mat.is_valid()) { + String mat_id; + if (mat->has_meta("import_id")) { + mat_id = mat->get_meta("import_id"); + } else { + mat_id = mat->get_name(); + } + + if (mat_id != String() && p_material_data.has(mat_id)) { + Dictionary matdata = p_material_data[mat_id]; + if (matdata.has("use_external/enabled") && bool(matdata["use_external/enabled"]) && matdata.has("use_external/path")) { + String path = matdata["use_external/path"]; + Ref<Material> external_mat = ResourceLoader::load(path); + if (external_mat.is_valid()) { + m->set_surface_material(i, external_mat); + } + } + } + } + } + + r_scanned_meshes.insert(m); + } + + if (node_settings.has("generate/physics")) { + int mesh_physics_mode = node_settings["generate/physics"]; + + if (mesh_physics_mode != MESH_PHYSICS_DISABLED) { + List<Ref<Shape3D>> shapes; + + if (collision_map.has(m)) { + shapes = collision_map[m]; + } else { + switch (mesh_physics_mode) { + case MESH_PHYSICS_MESH_AND_STATIC_COLLIDER: { + _pre_gen_shape_list(m, shapes, false); + } break; + case MESH_PHYSICS_RIGID_BODY_AND_MESH: { + _pre_gen_shape_list(m, shapes, true); + } break; + case MESH_PHYSICS_STATIC_COLLIDER_ONLY: { + _pre_gen_shape_list(m, shapes, false); + } break; + case MESH_PHYSICS_AREA_ONLY: { + _pre_gen_shape_list(m, shapes, true); + } break; + } + } + + if (shapes.size()) { + CollisionObject3D *base = nullptr; + switch (mesh_physics_mode) { + case MESH_PHYSICS_MESH_AND_STATIC_COLLIDER: { + StaticBody3D *col = memnew(StaticBody3D); + p_node->add_child(col); + base = col; + } break; + case MESH_PHYSICS_RIGID_BODY_AND_MESH: { + RigidBody3D *rigid_body = memnew(RigidBody3D); + rigid_body->set_name(p_node->get_name()); + p_node->replace_by(rigid_body); + rigid_body->set_transform(mi->get_transform()); + p_node = rigid_body; + mi->set_transform(Transform()); + rigid_body->add_child(mi); + mi->set_owner(rigid_body->get_owner()); + base = rigid_body; + } break; + case MESH_PHYSICS_STATIC_COLLIDER_ONLY: { + StaticBody3D *col = memnew(StaticBody3D); + col->set_transform(mi->get_transform()); + col->set_name(p_node->get_name()); + p_node->replace_by(col); + memdelete(p_node); + p_node = col; + base = col; + } break; + case MESH_PHYSICS_AREA_ONLY: { + Area3D *area = memnew(Area3D); + area->set_transform(mi->get_transform()); + area->set_name(p_node->get_name()); + p_node->replace_by(area); + memdelete(p_node); + p_node = area; + base = area; + + } break; + } + + int idx = 0; + for (List<Ref<Shape3D>>::Element *E = shapes.front(); E; E = E->next()) { + CollisionShape3D *cshape = memnew(CollisionShape3D); + cshape->set_shape(E->get()); + base->add_child(cshape); + + cshape->set_owner(base->get_owner()); + idx++; + } + } + } + } + } + } + + //navmesh (node may have changed type above) + if (Object::cast_to<EditorSceneImporterMeshNode3D>(p_node)) { + EditorSceneImporterMeshNode3D *mi = Object::cast_to<EditorSceneImporterMeshNode3D>(p_node); - cshape->set_name("shape" + itos(idx)); - cshape->set_owner(p_node->get_owner()); - idx++; + Ref<EditorSceneImporterMesh> m = mi->get_mesh(); + + if (m.is_valid()) { + if (node_settings.has("generate/navmesh")) { + int navmesh_mode = node_settings["generate/navmesh"]; + + if (navmesh_mode != NAVMESH_DISABLED) { + NavigationRegion3D *nmi = memnew(NavigationRegion3D); + + Ref<NavigationMesh> nmesh = m->create_navigation_mesh(); + nmi->set_navigation_mesh(nmesh); + + if (navmesh_mode == NAVMESH_NAVMESH_ONLY) { + nmi->set_transform(mi->get_transform()); + p_node->replace_by(nmi); + memdelete(p_node); + p_node = nmi; + } else { + mi->add_child(nmi); + nmi->set_owner(mi->get_owner()); + } + } + } + } + } + + if (Object::cast_to<AnimationPlayer>(p_node)) { + AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(p_node); + + { + //make sure this is unique + node_settings = node_settings.duplicate(true); + //fill node settings for this node with default values + List<ImportOption> iopts; + get_internal_import_options(INTERNAL_IMPORT_CATEGORY_ANIMATION_NODE, &iopts); + for (List<ImportOption>::Element *E = iopts.front(); E; E = E->next()) { + if (!node_settings.has(E->get().option.name)) { + node_settings[E->get().option.name] = E->get().default_value; + } + } + } + + bool use_optimizer = node_settings["optimizer/enabled"]; + float anim_optimizer_linerr = node_settings["optimizer/max_linear_error"]; + float anim_optimizer_angerr = node_settings["optimizer/max_angular_error"]; + float anim_optimizer_maxang = node_settings["optimizer/max_angle"]; + + if (use_optimizer) { + _optimize_animations(ap, anim_optimizer_linerr, anim_optimizer_angerr, anim_optimizer_maxang); + } + + Array animation_clips; + { + int clip_count = node_settings["clips/amount"]; + + for (int i = 0; i < clip_count; i++) { + String name = node_settings["clip_" + itos(i + 1) + "/name"]; + int from_frame = node_settings["clip_" + itos(i + 1) + "/start_frame"]; + int end_frame = node_settings["clip_" + itos(i + 1) + "/end_frame"]; + bool loop = node_settings["clip_" + itos(i + 1) + "/loops"]; + bool save_to_file = node_settings["clip_" + itos(i + 1) + "/save_to_file/enabled"]; + bool save_to_path = node_settings["clip_" + itos(i + 1) + "/save_to_file/path"]; + bool save_to_file_keep_custom = node_settings["clip_" + itos(i + 1) + "/save_to_file/keep_custom_tracks"]; + + animation_clips.push_back(name); + animation_clips.push_back(from_frame / p_animation_fps); + animation_clips.push_back(end_frame / p_animation_fps); + animation_clips.push_back(loop); + animation_clips.push_back(save_to_file); + animation_clips.push_back(save_to_path); + animation_clips.push_back(save_to_file_keep_custom); + } + } + + if (animation_clips.size()) { + _create_clips(ap, animation_clips, true); + } else { + List<StringName> anims; + ap->get_animation_list(&anims); + for (List<StringName>::Element *E = anims.front(); E; E = E->next()) { + String name = E->get(); + Ref<Animation> anim = ap->get_animation(name); + if (p_animation_data.has(name)) { + Dictionary anim_settings = p_animation_data[name]; + { + //fill with default values + List<ImportOption> iopts; + get_internal_import_options(INTERNAL_IMPORT_CATEGORY_ANIMATION, &iopts); + for (List<ImportOption>::Element *F = iopts.front(); F; F = F->next()) { + if (!anim_settings.has(F->get().option.name)) { + anim_settings[F->get().option.name] = F->get().default_value; + } + } + } + + anim->set_loop(anim_settings["settings/loops"]); + bool save = anim_settings["save_to_file/enabled"]; + String path = anim_settings["save_to_file/path"]; + bool keep_custom = anim_settings["save_to_file/keep_custom_tracks"]; + + Ref<Animation> saved_anim = _save_animation_to_file(anim, save, path, keep_custom); + + if (saved_anim != anim) { + ap->add_animation(name, saved_anim); //replace + } } } } @@ -644,27 +788,52 @@ Node *ResourceImporterScene::_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh> return p_node; } -void ResourceImporterScene::_create_clips(Node *scene, const Array &p_clips, bool p_bake_all) { - if (!scene->has_node(String("AnimationPlayer"))) { - return; +Ref<Animation> ResourceImporterScene::_save_animation_to_file(Ref<Animation> anim, bool p_save_to_file, String p_save_to_path, bool p_keep_custom_tracks) { + if (!p_save_to_file || !p_save_to_path.is_resource_file()) { + return anim; } - Node *n = scene->get_node(String("AnimationPlayer")); - ERR_FAIL_COND(!n); - AnimationPlayer *anim = Object::cast_to<AnimationPlayer>(n); - ERR_FAIL_COND(!anim); + if (FileAccess::exists(p_save_to_path) && p_keep_custom_tracks) { + // Copy custom animation tracks from previously imported files. + Ref<Animation> old_anim = ResourceLoader::load(p_save_to_path, "Animation", ResourceFormatLoader::CACHE_MODE_IGNORE); + if (old_anim.is_valid()) { + for (int i = 0; i < old_anim->get_track_count(); i++) { + if (!old_anim->track_is_imported(i)) { + old_anim->copy_track(i, anim); + } + } + anim->set_loop(old_anim->has_loop()); + } + } + if (ResourceCache::has(p_save_to_path)) { + Ref<Animation> old_anim = Ref<Resource>(ResourceCache::get(p_save_to_path)); + if (old_anim.is_valid()) { + old_anim->copy_from(anim); + anim = old_anim; + } + } + anim->set_path(p_save_to_path, true); // Set path to save externally. + Error err = ResourceSaver::save(p_save_to_path, anim, ResourceSaver::FLAG_CHANGE_PATH); + ERR_FAIL_COND_V_MSG(err != OK, anim, "Saving of animation failed: " + p_save_to_path); + return anim; +} + +void ResourceImporterScene::_create_clips(AnimationPlayer *anim, const Array &p_clips, bool p_bake_all) { if (!anim->has_animation("default")) { return; } Ref<Animation> default_anim = anim->get_animation("default"); - for (int i = 0; i < p_clips.size(); i += 4) { + for (int i = 0; i < p_clips.size(); i += 7) { String name = p_clips[i]; float from = p_clips[i + 1]; float to = p_clips[i + 2]; bool loop = p_clips[i + 3]; + bool save_to_file = p_clips[i + 4]; + String save_to_path = p_clips[i + 5]; + bool keep_current = p_clips[i + 6]; if (from >= to) { continue; } @@ -752,141 +921,17 @@ void ResourceImporterScene::_create_clips(Node *scene, const Array &p_clips, boo new_anim->set_loop(loop); new_anim->set_length(to - from); anim->add_animation(name, new_anim); - } - - anim->remove_animation("default"); //remove default (no longer needed) -} - -void ResourceImporterScene::_filter_anim_tracks(Ref<Animation> anim, Set<String> &keep) { - Ref<Animation> a = anim; - ERR_FAIL_COND(!a.is_valid()); - - for (int j = 0; j < a->get_track_count(); j++) { - String path = a->track_get_path(j); - if (!keep.has(path)) { - a->remove_track(j); - j--; + Ref<Animation> saved_anim = _save_animation_to_file(new_anim, save_to_file, save_to_path, keep_current); + if (saved_anim != new_anim) { + anim->add_animation(name, saved_anim); } } -} - -void ResourceImporterScene::_filter_tracks(Node *scene, const String &p_text) { - if (!scene->has_node(String("AnimationPlayer"))) { - return; - } - Node *n = scene->get_node(String("AnimationPlayer")); - ERR_FAIL_COND(!n); - AnimationPlayer *anim = Object::cast_to<AnimationPlayer>(n); - ERR_FAIL_COND(!anim); - - Vector<String> strings = p_text.split("\n"); - for (int i = 0; i < strings.size(); i++) { - strings.write[i] = strings[i].strip_edges(); - } - - List<StringName> anim_names; - anim->get_animation_list(&anim_names); - for (List<StringName>::Element *E = anim_names.front(); E; E = E->next()) { - String name = E->get(); - bool valid_for_this = false; - bool valid = false; - - Set<String> keep; - Set<String> keep_local; - - for (int i = 0; i < strings.size(); i++) { - if (strings[i].begins_with("@")) { - valid_for_this = false; - for (Set<String>::Element *F = keep_local.front(); F; F = F->next()) { - keep.insert(F->get()); - } - keep_local.clear(); - - Vector<String> filters = strings[i].substr(1, strings[i].length()).split(","); - for (int j = 0; j < filters.size(); j++) { - String fname = filters[j].strip_edges(); - if (fname == "") { - continue; - } - int fc = fname[0]; - bool plus; - if (fc == '+') { - plus = true; - } else if (fc == '-') { - plus = false; - } else { - continue; - } - String filter = fname.substr(1, fname.length()).strip_edges(); - - if (!name.matchn(filter)) { - continue; - } - valid_for_this = plus; - } - - if (valid_for_this) { - valid = true; - } - - } else if (valid_for_this) { - Ref<Animation> a = anim->get_animation(name); - if (!a.is_valid()) { - continue; - } - - for (int j = 0; j < a->get_track_count(); j++) { - String path = a->track_get_path(j); - - String tname = strings[i]; - if (tname == "") { - continue; - } - int fc = tname[0]; - bool plus; - if (fc == '+') { - plus = true; - } else if (fc == '-') { - plus = false; - } else { - continue; - } - - String filter = tname.substr(1, tname.length()).strip_edges(); - - if (!path.matchn(filter)) { - continue; - } - - if (plus) { - keep_local.insert(path); - } else if (!keep.has(path)) { - keep_local.erase(path); - } - } - } - } - - if (valid) { - for (Set<String>::Element *F = keep_local.front(); F; F = F->next()) { - keep.insert(F->get()); - } - _filter_anim_tracks(anim->get_animation(name), keep); - } - } + anim->remove_animation("default"); //remove default (no longer needed) } -void ResourceImporterScene::_optimize_animations(Node *scene, float p_max_lin_error, float p_max_ang_error, float p_max_angle) { - if (!scene->has_node(String("AnimationPlayer"))) { - return; - } - Node *n = scene->get_node(String("AnimationPlayer")); - ERR_FAIL_COND(!n); - AnimationPlayer *anim = Object::cast_to<AnimationPlayer>(n); - ERR_FAIL_COND(!anim); - +void ResourceImporterScene::_optimize_animations(AnimationPlayer *anim, float p_max_lin_error, float p_max_ang_error, float p_max_angle) { List<StringName> anim_names; anim->get_animation_list(&anim_names); for (List<StringName>::Element *E = anim_names.front(); E; E = E->next()) { @@ -895,208 +940,99 @@ void ResourceImporterScene::_optimize_animations(Node *scene, float p_max_lin_er } } -static String _make_extname(const String &p_str) { - String ext_name = p_str.replace(".", "_"); - ext_name = ext_name.replace(":", "_"); - ext_name = ext_name.replace("\"", "_"); - ext_name = ext_name.replace("<", "_"); - ext_name = ext_name.replace(">", "_"); - ext_name = ext_name.replace("/", "_"); - ext_name = ext_name.replace("|", "_"); - ext_name = ext_name.replace("\\", "_"); - ext_name = ext_name.replace("?", "_"); - ext_name = ext_name.replace("*", "_"); - - return ext_name; -} - -void ResourceImporterScene::_find_meshes(Node *p_node, Map<Ref<ArrayMesh>, Transform> &meshes) { - List<PropertyInfo> pi; - p_node->get_property_list(&pi); - - MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_node); - - if (mi) { - Ref<ArrayMesh> mesh = mi->get_mesh(); - - if (mesh.is_valid() && !meshes.has(mesh)) { - Node3D *s = mi; - Transform transform; - while (s) { - transform = transform * s->get_transform(); - s = Object::cast_to<Node3D>(s->get_parent()); +void ResourceImporterScene::get_internal_import_options(InternalImportCategory p_category, List<ImportOption> *r_options) const { + switch (p_category) { + case INTERNAL_IMPORT_CATEGORY_NODE: { + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "import/skip_import", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false)); + } break; + case INTERNAL_IMPORT_CATEGORY_MESH_3D_NODE: { + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "import/skip_import", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "generate/physics", PROPERTY_HINT_ENUM, "Disabled,Mesh + Static Collider,Rigid Body + Mesh,Static Collider Only,Area Only"), 0)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "generate/navmesh", PROPERTY_HINT_ENUM, "Disabled,Mesh + NavMesh,NavMesh Only"), 0)); + } break; + case INTERNAL_IMPORT_CATEGORY_MESH: { + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "save_to_file/enabled", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false)); + r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "save_to_file/path", PROPERTY_HINT_SAVE_FILE, "*.res,*.tres"), "")); + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "save_to_file/make_streamable"), "")); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "generate/shadow_meshes", PROPERTY_HINT_ENUM, "Default,Enable,Disable"), 0)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "generate/lightmap_uv", PROPERTY_HINT_ENUM, "Default,Enable,Disable"), 0)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "generate/lods", PROPERTY_HINT_ENUM, "Default,Enable,Disable"), 0)); + } break; + case INTERNAL_IMPORT_CATEGORY_MATERIAL: { + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "use_external/enabled", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false)); + r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "use_external/path", PROPERTY_HINT_FILE, "*.material,*.res,*.tres"), "")); + } break; + case INTERNAL_IMPORT_CATEGORY_ANIMATION: { + r_options->push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::BOOL, "settings/loops"), false)); + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "save_to_file/enabled", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false)); + r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "save_to_file/path", PROPERTY_HINT_SAVE_FILE, "*.res,*.tres"), "")); + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "save_to_file/keep_custom_tracks"), "")); + } break; + case INTERNAL_IMPORT_CATEGORY_ANIMATION_NODE: { + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "import/skip_import", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false)); + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "optimizer/enabled", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), true)); + r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "optimizer/max_linear_error"), 0.05)); + r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "optimizer/max_angular_error"), 0.01)); + r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "optimizer/max_angle"), 22)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "slices/amount", PROPERTY_HINT_RANGE, "0,256,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), 0)); + + for (int i = 0; i < 256; i++) { + r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "slice_" + itos(i + 1) + "/name"), "")); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "slice_" + itos(i + 1) + "/start_frame"), 0)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "slice_" + itos(i + 1) + "/end_frame"), 0)); + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "slice_" + itos(i + 1) + "/loops"), false)); + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "slice_" + itos(i + 1) + "/save_to_file/enabled", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), false)); + r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "slice_" + itos(i + 1) + "/save_to_file/path", PROPERTY_HINT_SAVE_FILE, ".res,*.tres"), "")); + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "slice_" + itos(i + 1) + "/save_to_file/keep_custom_tracks"), false)); } - - meshes[mesh] = transform; + } break; + default: { } } - for (int i = 0; i < p_node->get_child_count(); i++) { - _find_meshes(p_node->get_child(i), meshes); - } } -void ResourceImporterScene::_make_external_resources(Node *p_node, const String &p_base_path, bool p_make_animations, bool p_animations_as_text, bool p_keep_animations, bool p_make_materials, bool p_materials_as_text, bool p_keep_materials, bool p_make_meshes, bool p_meshes_as_text, Map<Ref<Animation>, Ref<Animation>> &p_animations, Map<Ref<Material>, Ref<Material>> &p_materials, Map<Ref<ArrayMesh>, Ref<ArrayMesh>> &p_meshes) { - List<PropertyInfo> pi; - - if (p_make_animations) { - if (Object::cast_to<AnimationPlayer>(p_node)) { - AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(p_node); - - List<StringName> anims; - ap->get_animation_list(&anims); - for (List<StringName>::Element *E = anims.front(); E; E = E->next()) { - Ref<Animation> anim = ap->get_animation(E->get()); - ERR_CONTINUE(anim.is_null()); - - if (!p_animations.has(anim)) { - // Tracks from source file should be set as imported, anything else is a custom track. - for (int i = 0; i < anim->get_track_count(); i++) { - anim->track_set_imported(i, true); - } - - String ext_name; - - if (p_animations_as_text) { - ext_name = p_base_path.plus_file(_make_extname(E->get()) + ".tres"); - } else { - ext_name = p_base_path.plus_file(_make_extname(E->get()) + ".anim"); - } - - if (FileAccess::exists(ext_name) && p_keep_animations) { - // Copy custom animation tracks from previously imported files. - Ref<Animation> old_anim = ResourceLoader::load(ext_name, "Animation", true); - if (old_anim.is_valid()) { - for (int i = 0; i < old_anim->get_track_count(); i++) { - if (!old_anim->track_is_imported(i)) { - old_anim->copy_track(i, anim); - } - } - anim->set_loop(old_anim->has_loop()); - } - } - - anim->set_path(ext_name, true); // Set path to save externally. - ResourceSaver::save(ext_name, anim, ResourceSaver::FLAG_CHANGE_PATH); - p_animations[anim] = anim; - } +bool ResourceImporterScene::get_internal_option_visibility(InternalImportCategory p_category, const String &p_option, const Map<StringName, Variant> &p_options) const { + if (p_options.has("import/skip_import") && p_option != "import/skip_import" && bool(p_options["import/skip_import"])) { + return false; //if skip import + } + switch (p_category) { + case INTERNAL_IMPORT_CATEGORY_NODE: { + } break; + case INTERNAL_IMPORT_CATEGORY_MESH_3D_NODE: { + } break; + case INTERNAL_IMPORT_CATEGORY_MESH: { + if (p_option == "save_to_file/path" || p_option == "save_to_file/make_streamable") { + return p_options["save_to_file/enabled"]; + } + } break; + case INTERNAL_IMPORT_CATEGORY_MATERIAL: { + if (p_option == "use_external/path") { + return p_options["use_external/enabled"]; + } + } break; + case INTERNAL_IMPORT_CATEGORY_ANIMATION: { + if (p_option == "save_to_file/path" || p_option == "save_to_file/keep_custom_tracks") { + return p_options["save_to_file/enabled"]; + } + } break; + case INTERNAL_IMPORT_CATEGORY_ANIMATION_NODE: { + if (p_option.begins_with("animation/optimizer/") && p_option != "animation/optimizer/enabled" && !bool(p_options["animation/optimizer/enabled"])) { + return false; } - } - } - - p_node->get_property_list(&pi); - - for (List<PropertyInfo>::Element *E = pi.front(); E; E = E->next()) { - if (E->get().type == Variant::OBJECT) { - Ref<Material> mat = p_node->get(E->get().name); - - if (p_make_materials && mat.is_valid() && mat->get_name() != "") { - if (!p_materials.has(mat)) { - String ext_name; - - if (p_materials_as_text) { - ext_name = p_base_path.plus_file(_make_extname(mat->get_name()) + ".tres"); - } else { - ext_name = p_base_path.plus_file(_make_extname(mat->get_name()) + ".material"); - } - - if (p_keep_materials && FileAccess::exists(ext_name)) { - //if exists, use it - p_materials[mat] = ResourceLoader::load(ext_name); - } else { - ResourceSaver::save(ext_name, mat, ResourceSaver::FLAG_CHANGE_PATH); - p_materials[mat] = ResourceLoader::load(ext_name, "", true); // disable loading from the cache. - } - } - - if (p_materials[mat] != mat) { - p_node->set(E->get().name, p_materials[mat]); - } - } else { - Ref<ArrayMesh> mesh = p_node->get(E->get().name); - - if (mesh.is_valid()) { - bool mesh_just_added = false; - - if (p_make_meshes) { - if (!p_meshes.has(mesh)) { - //meshes are always overwritten, keeping them is not practical - String ext_name; - - if (p_meshes_as_text) { - ext_name = p_base_path.plus_file(_make_extname(mesh->get_name()) + ".tres"); - } else { - ext_name = p_base_path.plus_file(_make_extname(mesh->get_name()) + ".mesh"); - } - - ResourceSaver::save(ext_name, mesh, ResourceSaver::FLAG_CHANGE_PATH); - p_meshes[mesh] = ResourceLoader::load(ext_name); - p_node->set(E->get().name, p_meshes[mesh]); - mesh_just_added = true; - } - } - - if (p_make_materials) { - if (mesh_just_added || !p_meshes.has(mesh)) { - for (int i = 0; i < mesh->get_surface_count(); i++) { - mat = mesh->surface_get_material(i); - - if (!mat.is_valid()) { - continue; - } - if (mat->get_name() == "") { - continue; - } - - if (!p_materials.has(mat)) { - String ext_name; - - if (p_materials_as_text) { - ext_name = p_base_path.plus_file(_make_extname(mat->get_name()) + ".tres"); - } else { - ext_name = p_base_path.plus_file(_make_extname(mat->get_name()) + ".material"); - } - - if (p_keep_materials && FileAccess::exists(ext_name)) { - //if exists, use it - p_materials[mat] = ResourceLoader::load(ext_name); - } else { - ResourceSaver::save(ext_name, mat, ResourceSaver::FLAG_CHANGE_PATH); - p_materials[mat] = ResourceLoader::load(ext_name, "", true); // disable loading from the cache. - } - } - - if (p_materials[mat] != mat) { - mesh->surface_set_material(i, p_materials[mat]); - - //re-save the mesh since a material is now assigned - if (p_make_meshes) { - String ext_name; - - if (p_meshes_as_text) { - ext_name = p_base_path.plus_file(_make_extname(mesh->get_name()) + ".tres"); - } else { - ext_name = p_base_path.plus_file(_make_extname(mesh->get_name()) + ".mesh"); - } - - ResourceSaver::save(ext_name, mesh, ResourceSaver::FLAG_CHANGE_PATH); - p_meshes[mesh] = ResourceLoader::load(ext_name); - } - } - } - if (!p_make_meshes) { - p_meshes[mesh] = Ref<ArrayMesh>(); //save it anyway, so it won't be checked again - } - } - } + if (p_option.begins_with("animation/slice_")) { + int max_slice = p_options["animation/slices/amount"]; + int slice = p_option.get_slice("/", 1).get_slice("_", 1).to_int() - 1; + if (slice >= max_slice) { + return false; } } + } break; + default: { } } - for (int i = 0; i < p_node->get_child_count(); i++) { - _make_external_resources(p_node->get_child(i), p_base_path, p_make_animations, p_animations_as_text, p_keep_animations, p_make_materials, p_materials_as_text, p_keep_materials, p_make_meshes, p_meshes_as_text, p_animations, p_materials, p_meshes); - } + return true; } void ResourceImporterScene::get_import_options(List<ImportOption> *r_options, int p_preset) const { @@ -1115,42 +1051,18 @@ void ResourceImporterScene::get_import_options(List<ImportOption> *r_options, in script_ext_hint += "*." + E->get(); } - bool materials_out = p_preset == PRESET_SEPARATE_MATERIALS || p_preset == PRESET_SEPARATE_MESHES_AND_MATERIALS || p_preset == PRESET_MULTIPLE_SCENES_AND_MATERIALS || p_preset == PRESET_SEPARATE_MATERIALS_AND_ANIMATIONS || p_preset == PRESET_SEPARATE_MESHES_MATERIALS_AND_ANIMATIONS; - bool meshes_out = p_preset == PRESET_SEPARATE_MESHES || p_preset == PRESET_SEPARATE_MESHES_AND_MATERIALS || p_preset == PRESET_SEPARATE_MESHES_AND_ANIMATIONS || p_preset == PRESET_SEPARATE_MESHES_MATERIALS_AND_ANIMATIONS; - bool scenes_out = p_preset == PRESET_MULTIPLE_SCENES || p_preset == PRESET_MULTIPLE_SCENES_AND_MATERIALS; - bool animations_out = p_preset == PRESET_SEPARATE_ANIMATIONS || p_preset == PRESET_SEPARATE_MESHES_AND_ANIMATIONS || p_preset == PRESET_SEPARATE_MATERIALS_AND_ANIMATIONS || p_preset == PRESET_SEPARATE_MESHES_MATERIALS_AND_ANIMATIONS; - r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "nodes/root_scale", PROPERTY_HINT_RANGE, "0.001,1000,0.001"), 1.0)); - r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "nodes/custom_script", PROPERTY_HINT_FILE, script_ext_hint), "")); - r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "nodes/storage", PROPERTY_HINT_ENUM, "Single Scene,Instanced Sub-Scenes"), scenes_out ? 1 : 0)); - r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "materials/location", PROPERTY_HINT_ENUM, "Node,Mesh"), (meshes_out || materials_out) ? 1 : 0)); - r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "materials/storage", PROPERTY_HINT_ENUM, "Built-In,Files (.material),Files (.tres)", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), materials_out ? 1 : 0)); - r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "materials/keep_on_reimport"), materials_out)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "meshes/ensure_tangents"), true)); - r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "meshes/storage", PROPERTY_HINT_ENUM, "Built-In,Files (.mesh),Files (.tres)"), meshes_out ? 1 : 0)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "meshes/generate_lods"), true)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "meshes/create_shadow_meshes"), true)); - r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "meshes/light_baking", PROPERTY_HINT_ENUM, "Disabled,Enable,Gen Lightmaps", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), 0)); + r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "meshes/light_baking", PROPERTY_HINT_ENUM, "Disabled,Dynamic,Static,Static Lightmaps", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), 2)); r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "meshes/lightmap_texel_size", PROPERTY_HINT_RANGE, "0.001,100,0.001"), 0.1)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "skins/use_named_skins"), true)); - r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "external_files/store_in_subdir"), false)); - r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/import", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), true)); + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/import"), true)); r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "animation/fps", PROPERTY_HINT_RANGE, "1,120,1"), 15)); - r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "animation/filter_script", PROPERTY_HINT_MULTILINE_TEXT), "")); - r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "animation/storage", PROPERTY_HINT_ENUM, "Built-In,Files (.anim),Files (.tres)", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), animations_out)); - r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/keep_custom_tracks"), animations_out)); - r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/optimizer/enabled", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), true)); - r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "animation/optimizer/max_linear_error"), 0.05)); - r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "animation/optimizer/max_angular_error"), 0.01)); - r_options->push_back(ImportOption(PropertyInfo(Variant::FLOAT, "animation/optimizer/max_angle"), 22)); - r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/optimizer/remove_unused_tracks"), true)); - r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "animation/clips/amount", PROPERTY_HINT_RANGE, "0,256,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), 0)); - for (int i = 0; i < 256; i++) { - r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "animation/clip_" + itos(i + 1) + "/name"), "")); - r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "animation/clip_" + itos(i + 1) + "/start_frame"), 0)); - r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "animation/clip_" + itos(i + 1) + "/end_frame"), 0)); - r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "animation/clip_" + itos(i + 1) + "/loops"), false)); - } + r_options->push_back(ImportOption(PropertyInfo(Variant::STRING, "import_script/path", PROPERTY_HINT_FILE, script_ext_hint), "")); + + r_options->push_back(ImportOption(PropertyInfo(Variant::DICTIONARY, "_subresources", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), Dictionary())); } void ResourceImporterScene::_replace_owner(Node *p_node, Node *p_scene, Node *p_new_owner) { @@ -1222,7 +1134,7 @@ Ref<Animation> ResourceImporterScene::import_animation_from_other_importer(Edito return importer->import_animation(p_path, p_flags, p_bake_fps); } -void ResourceImporterScene::_generate_meshes(Node *p_node, bool p_generate_lods, bool p_create_shadow_meshes) { +void ResourceImporterScene::_generate_meshes(Node *p_node, const Dictionary &p_mesh_data, bool p_generate_lods, bool p_create_shadow_meshes, LightBakeMode p_light_bake_mode, float p_lightmap_texel_size, const Vector<uint8_t> &p_src_lightmap_cache, Vector<uint8_t> &r_dst_lightmap_cache) { EditorSceneImporterMeshNode3D *src_mesh_node = Object::cast_to<EditorSceneImporterMeshNode3D>(p_node); if (src_mesh_node) { //is mesh @@ -1235,14 +1147,94 @@ void ResourceImporterScene::_generate_meshes(Node *p_node, bool p_generate_lods, Ref<ArrayMesh> mesh; if (!src_mesh_node->get_mesh()->has_mesh()) { //do mesh processing - if (p_generate_lods) { + + bool generate_lods = p_generate_lods; + bool create_shadow_meshes = p_create_shadow_meshes; + bool bake_lightmaps = p_light_bake_mode == LIGHT_BAKE_STATIC_LIGHTMAPS; + String save_to_file; + + String mesh_id; + + if (src_mesh_node->get_mesh()->has_meta("import_id")) { + mesh_id = src_mesh_node->get_mesh()->get_meta("import_id"); + } else { + mesh_id = src_mesh_node->get_mesh()->get_name(); + } + + if (mesh_id != String() && p_mesh_data.has(mesh_id)) { + Dictionary mesh_settings = p_mesh_data[mesh_id]; + + if (mesh_settings.has("generate/shadow_meshes")) { + int shadow_meshes = mesh_settings["generate/shadow_meshes"]; + if (shadow_meshes == MESH_OVERRIDE_ENABLE) { + create_shadow_meshes = true; + } else if (shadow_meshes == MESH_OVERRIDE_DISABLE) { + create_shadow_meshes = false; + } + } + + if (mesh_settings.has("generate/lightmap_uv")) { + int lightmap_uv = mesh_settings["generate/lightmap_uv"]; + if (lightmap_uv == MESH_OVERRIDE_ENABLE) { + bake_lightmaps = true; + } else if (lightmap_uv == MESH_OVERRIDE_DISABLE) { + bake_lightmaps = false; + } + } + + if (mesh_settings.has("generate/lods")) { + int lods = mesh_settings["generate/lods"]; + if (lods == MESH_OVERRIDE_ENABLE) { + generate_lods = true; + } else if (lods == MESH_OVERRIDE_DISABLE) { + generate_lods = false; + } + } + + if (mesh_settings.has("save_to_file/enabled") && bool(mesh_settings["save_to_file/enabled"]) && mesh_settings.has("save_to_file/path")) { + save_to_file = mesh_settings["save_to_file/path"]; + if (!save_to_file.is_resource_file()) { + save_to_file = ""; + } + } + } + + if (generate_lods) { src_mesh_node->get_mesh()->generate_lods(); } - if (p_create_shadow_meshes) { + if (create_shadow_meshes) { src_mesh_node->get_mesh()->create_shadow_mesh(); } + + if (bake_lightmaps) { + Transform xf; + Node3D *n = src_mesh_node; + while (n) { + xf = n->get_transform() * xf; + n = n->get_parent_spatial(); + } + + //use xf as transform for mesh, and bake it + } + + if (save_to_file != String()) { + Ref<Mesh> existing = Ref<Resource>(ResourceCache::get(save_to_file)); + if (existing.is_valid()) { + //if somehow an existing one is useful, create + existing->reset_state(); + } + mesh = src_mesh_node->get_mesh()->get_mesh(existing); + + ResourceSaver::save(save_to_file, mesh); //override + + mesh->set_path(save_to_file, true); //takeover existing, if needed + + } else { + mesh = src_mesh_node->get_mesh()->get_mesh(); + } + } else { + mesh = src_mesh_node->get_mesh()->get_mesh(); } - mesh = src_mesh_node->get_mesh()->get_mesh(); if (mesh.is_valid()) { mesh_node->set_mesh(mesh); @@ -1251,15 +1243,78 @@ void ResourceImporterScene::_generate_meshes(Node *p_node, bool p_generate_lods, } } } + + switch (p_light_bake_mode) { + case LIGHT_BAKE_DISABLED: { + mesh_node->set_gi_mode(GeometryInstance3D::GI_MODE_DISABLED); + } break; + case LIGHT_BAKE_DYNAMIC: { + mesh_node->set_gi_mode(GeometryInstance3D::GI_MODE_DYNAMIC); + } break; + case LIGHT_BAKE_STATIC: + case LIGHT_BAKE_STATIC_LIGHTMAPS: { + mesh_node->set_gi_mode(GeometryInstance3D::GI_MODE_BAKED); + } break; + } + p_node->replace_by(mesh_node); memdelete(p_node); p_node = mesh_node; } for (int i = 0; i < p_node->get_child_count(); i++) { - _generate_meshes(p_node->get_child(i), p_generate_lods, p_create_shadow_meshes); + _generate_meshes(p_node->get_child(i), p_mesh_data, p_generate_lods, p_create_shadow_meshes, p_light_bake_mode, p_lightmap_texel_size, p_src_lightmap_cache, r_dst_lightmap_cache); + } +} + +void ResourceImporterScene::_add_shapes(Node *p_node, const List<Ref<Shape3D>> &p_shapes) { + for (const List<Ref<Shape3D>>::Element *E = p_shapes.front(); E; E = E->next()) { + CollisionShape3D *cshape = memnew(CollisionShape3D); + cshape->set_shape(E->get()); + p_node->add_child(cshape); + + cshape->set_owner(p_node->get_owner()); } } + +Node *ResourceImporterScene::pre_import(const String &p_source_file) { + Ref<EditorSceneImporter> importer; + String ext = p_source_file.get_extension().to_lower(); + + EditorProgress progress("pre-import", TTR("Pre-Import Scene"), 0); + progress.step(TTR("Importing Scene..."), 0); + + for (Set<Ref<EditorSceneImporter>>::Element *E = importers.front(); E; E = E->next()) { + List<String> extensions; + E->get()->get_extensions(&extensions); + + for (List<String>::Element *F = extensions.front(); F; F = F->next()) { + if (F->get().to_lower() == ext) { + importer = E->get(); + break; + } + } + + if (importer.is_valid()) { + break; + } + } + + ERR_FAIL_COND_V(!importer.is_valid(), nullptr); + + Error err; + Node *scene = importer->import_scene(p_source_file, EditorSceneImporter::IMPORT_ANIMATION | EditorSceneImporter::IMPORT_GENERATE_TANGENT_ARRAYS, 15, nullptr, &err); + if (!scene || err != OK) { + return nullptr; + } + + Map<Ref<EditorSceneImporterMesh>, List<Ref<Shape3D>>> collision_map; + + _pre_fix_node(scene, scene, collision_map); + + return scene; +} + Error ResourceImporterScene::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) { const String &src_path = p_source_file; @@ -1289,27 +1344,21 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p float fps = p_options["animation/fps"]; - int import_flags = EditorSceneImporter::IMPORT_ANIMATION_DETECT_LOOP; - if (!bool(p_options["animation/optimizer/remove_unused_tracks"])) { - import_flags |= EditorSceneImporter::IMPORT_ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS; - } + int import_flags = 0; if (bool(p_options["animation/import"])) { import_flags |= EditorSceneImporter::IMPORT_ANIMATION; } - if (bool(p_options["meshes/ensure_tangents"])) { - import_flags |= EditorSceneImporter::IMPORT_GENERATE_TANGENT_ARRAYS; - } - - if (int(p_options["materials/location"]) == 0) { - import_flags |= EditorSceneImporter::IMPORT_MATERIALS_IN_INSTANCES; - } - if (bool(p_options["skins/use_named_skins"])) { import_flags |= EditorSceneImporter::IMPORT_USE_NAMED_SKIN_BINDS; } + bool ensure_tangents = p_options["meshes/ensure_tangents"]; + if (ensure_tangents) { + import_flags |= EditorSceneImporter::IMPORT_GENERATE_TANGENT_ARRAYS; + } + Error err = OK; List<String> missing_deps; // for now, not much will be done with this Node *scene = importer->import_scene(src_path, import_flags, fps, &missing_deps, &err); @@ -1317,6 +1366,29 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p return err; } + Dictionary subresources = p_options["_subresources"]; + + Dictionary node_data; + if (subresources.has("nodes")) { + node_data = subresources["nodes"]; + } + + Dictionary material_data; + if (subresources.has("materials")) { + material_data = subresources["materials"]; + } + + Dictionary animation_data; + if (subresources.has("animations")) { + animation_data = subresources["animations"]; + } + + Set<Ref<EditorSceneImporterMesh>> scanned_meshes; + Map<Ref<EditorSceneImporterMesh>, List<Ref<Shape3D>>> collision_map; + + _pre_fix_node(scene, scene, collision_map); + _post_fix_node(scene, scene, collision_map, scanned_meshes, node_data, material_data, animation_data, fps); + String root_type = p_options["nodes/root_type"]; root_type = root_type.split(" ")[0]; // full root_type is "ClassName (filename.gd)" for a script global class. @@ -1354,73 +1426,35 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p bool gen_lods = bool(p_options["meshes/generate_lods"]); bool create_shadow_meshes = bool(p_options["meshes/create_shadow_meshes"]); - - _generate_meshes(scene, gen_lods, create_shadow_meshes); - - err = OK; - - String animation_filter = String(p_options["animation/filter_script"]).strip_edges(); - - bool use_optimizer = p_options["animation/optimizer/enabled"]; - float anim_optimizer_linerr = p_options["animation/optimizer/max_linear_error"]; - float anim_optimizer_angerr = p_options["animation/optimizer/max_angular_error"]; - float anim_optimizer_maxang = p_options["animation/optimizer/max_angle"]; int light_bake_mode = p_options["meshes/light_baking"]; + float texel_size = p_options["meshes/lightmap_texel_size"]; + float lightmap_texel_size = MAX(0.001, texel_size); - Map<Ref<Mesh>, List<Ref<Shape3D>>> collision_map; - - scene = _fix_node(scene, scene, collision_map, LightBakeMode(light_bake_mode)); - - if (use_optimizer) { - _optimize_animations(scene, anim_optimizer_linerr, anim_optimizer_angerr, anim_optimizer_maxang); - } + Vector<uint8_t> src_lightmap_cache; + Vector<uint8_t> dst_lightmap_cache; - Array animation_clips; { - int clip_count = p_options["animation/clips/amount"]; - - for (int i = 0; i < clip_count; i++) { - String name = p_options["animation/clip_" + itos(i + 1) + "/name"]; - int from_frame = p_options["animation/clip_" + itos(i + 1) + "/start_frame"]; - int end_frame = p_options["animation/clip_" + itos(i + 1) + "/end_frame"]; - bool loop = p_options["animation/clip_" + itos(i + 1) + "/loops"]; - - animation_clips.push_back(name); - animation_clips.push_back(from_frame / fps); - animation_clips.push_back(end_frame / fps); - animation_clips.push_back(loop); + src_lightmap_cache = FileAccess::get_file_as_array(p_source_file + ".unwrap_cache", &err); + if (err != OK) { + src_lightmap_cache.clear(); } } - if (animation_clips.size()) { - _create_clips(scene, animation_clips, !bool(p_options["animation/optimizer/remove_unused_tracks"])); - } - if (animation_filter != "") { - _filter_tracks(scene, animation_filter); + Dictionary mesh_data; + if (subresources.has("meshes")) { + mesh_data = subresources["meshes"]; } + _generate_meshes(scene, mesh_data, gen_lods, create_shadow_meshes, LightBakeMode(light_bake_mode), lightmap_texel_size, src_lightmap_cache, dst_lightmap_cache); - bool external_animations = int(p_options["animation/storage"]) == 1 || int(p_options["animation/storage"]) == 2; - bool external_animations_as_text = int(p_options["animation/storage"]) == 2; - bool keep_custom_tracks = p_options["animation/keep_custom_tracks"]; - bool external_materials = int(p_options["materials/storage"]) == 1 || int(p_options["materials/storage"]) == 2; - bool external_materials_as_text = int(p_options["materials/storage"]) == 2; - bool external_meshes = int(p_options["meshes/storage"]) == 1 || int(p_options["meshes/storage"]) == 2; - bool external_meshes_as_text = int(p_options["meshes/storage"]) == 2; - bool external_scenes = int(p_options["nodes/storage"]) == 1; - - String base_path = p_source_file.get_base_dir(); - - if (external_animations || external_materials || external_meshes || external_scenes) { - if (bool(p_options["external_files/store_in_subdir"])) { - String subdir_name = p_source_file.get_file().get_basename(); - DirAccess *da = DirAccess::open(base_path); - Error err2 = da->make_dir(subdir_name); - memdelete(da); - ERR_FAIL_COND_V_MSG(err2 != OK && err2 != ERR_ALREADY_EXISTS, err2, "Cannot make directory '" + subdir_name + "'."); - base_path = base_path.plus_file(subdir_name); + if (dst_lightmap_cache.size()) { + FileAccessRef f = FileAccess::open(p_source_file + ".unwrap_cache", FileAccess::WRITE); + if (f) { + f->store_buffer(dst_lightmap_cache.ptr(), dst_lightmap_cache.size()); } } + err = OK; +#if 0 if (light_bake_mode == 2 /* || generate LOD */) { Map<Ref<ArrayMesh>, Transform> meshes; _find_meshes(scene, meshes); @@ -1445,9 +1479,6 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p } } - float texel_size = p_options["meshes/lightmap_texel_size"]; - texel_size = MAX(0.001, texel_size); - Map<String, unsigned int> used_unwraps; EditorProgress progress2("gen_lightmaps", TTR("Generating Lightmaps"), meshes.size()); @@ -1469,7 +1500,7 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p if (err2 != OK) { EditorNode::add_io_error("Mesh '" + name + "' failed lightmap generation. Please fix geometry."); } else { - String hash = String::md5((unsigned char *)ret_cache_data); +` String hash = String::md5((unsigned char *)ret_cache_data); used_unwraps.insert(hash, ret_cache_size); if (!ret_used_cache) { @@ -1482,7 +1513,7 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p } else { int current_size = cache_data.size(); cache_data.resize(cache_data.size() + ret_cache_size); - unsigned char *ptrw = cache_data.ptrw(); + unsigned char *ptrw = cache_data.ptrw(); memcpy(&ptrw[current_size], ret_cache_data, ret_cache_size); int *data = (int *)ptrw; data[0] += 1; @@ -1530,20 +1561,11 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p file->close(); } } - - if (external_animations || external_materials || external_meshes) { - Map<Ref<Animation>, Ref<Animation>> anim_map; - Map<Ref<Material>, Ref<Material>> mat_map; - Map<Ref<ArrayMesh>, Ref<ArrayMesh>> mesh_map; - - bool keep_materials = bool(p_options["materials/keep_on_reimport"]); - - _make_external_resources(scene, base_path, external_animations, external_animations_as_text, keep_custom_tracks, external_materials, external_materials_as_text, keep_materials, external_meshes, external_meshes_as_text, anim_map, mat_map, mesh_map); - } +#endif progress.step(TTR("Running Custom Script..."), 2); - String post_import_script_path = p_options["nodes/custom_script"]; + String post_import_script_path = p_options["import_script/path"]; Ref<EditorScenePostImport> post_import_script; if (post_import_script_path != "") { @@ -1562,7 +1584,7 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p } if (post_import_script.is_valid()) { - post_import_script->init(base_path, p_source_file); + post_import_script->init(p_source_file); scene = post_import_script->post_import(scene); if (!scene) { EditorNode::add_io_error( @@ -1574,29 +1596,6 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p progress.step(TTR("Saving..."), 104); - if (external_scenes) { - //save sub-scenes as instances! - for (int i = 0; i < scene->get_child_count(); i++) { - Node *child = scene->get_child(i); - if (child->get_owner() != scene) { - continue; //not a real child probably created by scene type (ig, a scrollbar) - } - _replace_owner(child, scene, child); - - String cn = String(child->get_name()).strip_edges().replace(".", "_").replace(":", "_"); - if (cn == String()) { - cn = "ChildNode" + itos(i); - } - String path = base_path.plus_file(cn + ".scn"); - child->set_filename(path); - - Ref<PackedScene> packer = memnew(PackedScene); - packer->pack(child); - err = ResourceSaver::save(path, packer); //do not take over, let the changed files reload themselves - ERR_FAIL_COND_V_MSG(err != OK, err, "Cannot save scene to file '" + path + "'."); - } - } - Ref<PackedScene> packer = memnew(PackedScene); packer->pack(scene); print_verbose("Saving scene to: " + p_save_path + ".scn"); @@ -1613,6 +1612,13 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p ResourceImporterScene *ResourceImporterScene::singleton = nullptr; +bool ResourceImporterScene::ResourceImporterScene::has_advanced_options() const { + return true; +} +void ResourceImporterScene::ResourceImporterScene::show_advanced_options(const String &p_path) { + SceneImportSettings::get_singleton()->open_settings(p_path); +} + ResourceImporterScene::ResourceImporterScene() { singleton = this; } diff --git a/editor/import/resource_importer_scene.h b/editor/import/resource_importer_scene.h index aced0226ff..6c6af57c4c 100644 --- a/editor/import/resource_importer_scene.h +++ b/editor/import/resource_importer_scene.h @@ -39,7 +39,9 @@ #include "scene/resources/skin.h" class Material; +class AnimationPlayer; +class EditorSceneImporterMesh; class EditorSceneImporter : public Reference { GDCLASS(EditorSceneImporter, Reference); @@ -53,15 +55,9 @@ public: enum ImportFlags { IMPORT_SCENE = 1, IMPORT_ANIMATION = 2, - IMPORT_ANIMATION_DETECT_LOOP = 4, - IMPORT_ANIMATION_OPTIMIZE = 8, - IMPORT_ANIMATION_FORCE_ALL_TRACKS_IN_ALL_CLIPS = 16, - IMPORT_ANIMATION_KEEP_VALUE_TRACKS = 32, - IMPORT_GENERATE_TANGENT_ARRAYS = 256, - IMPORT_FAIL_ON_MISSING_DEPENDENCIES = 512, - IMPORT_MATERIALS_IN_INSTANCES = 1024, - IMPORT_USE_COMPRESSION = 2048, - IMPORT_USE_NAMED_SKIN_BINDS = 4096, + IMPORT_FAIL_ON_MISSING_DEPENDENCIES = 4, + IMPORT_GENERATE_TANGENT_ARRAYS = 8, + IMPORT_USE_NAMED_SKIN_BINDS = 16, }; @@ -76,17 +72,15 @@ public: class EditorScenePostImport : public Reference { GDCLASS(EditorScenePostImport, Reference); - String source_folder; String source_file; protected: static void _bind_methods(); public: - String get_source_folder() const; String get_source_file() const; virtual Node *post_import(Node *p_scene); - virtual void init(const String &p_source_folder, const String &p_source_file); + virtual void init(const String &p_source_file); EditorScenePostImport(); }; @@ -97,31 +91,36 @@ class ResourceImporterScene : public ResourceImporter { static ResourceImporterScene *singleton; - enum Presets { - PRESET_SEPARATE_MATERIALS, - PRESET_SEPARATE_MESHES, - PRESET_SEPARATE_ANIMATIONS, - - PRESET_SINGLE_SCENE, + enum LightBakeMode { + LIGHT_BAKE_DISABLED, + LIGHT_BAKE_DYNAMIC, + LIGHT_BAKE_STATIC, + LIGHT_BAKE_STATIC_LIGHTMAPS + }; - PRESET_SEPARATE_MESHES_AND_MATERIALS, - PRESET_SEPARATE_MESHES_AND_ANIMATIONS, - PRESET_SEPARATE_MATERIALS_AND_ANIMATIONS, - PRESET_SEPARATE_MESHES_MATERIALS_AND_ANIMATIONS, + enum MeshPhysicsMode { + MESH_PHYSICS_DISABLED, + MESH_PHYSICS_MESH_AND_STATIC_COLLIDER, + MESH_PHYSICS_RIGID_BODY_AND_MESH, + MESH_PHYSICS_STATIC_COLLIDER_ONLY, + MESH_PHYSICS_AREA_ONLY, + }; - PRESET_MULTIPLE_SCENES, - PRESET_MULTIPLE_SCENES_AND_MATERIALS, - PRESET_MAX + enum NavMeshMode { + NAVMESH_DISABLED, + NAVMESH_MESH_AND_NAVMESH, + NAVMESH_NAVMESH_ONLY, }; - enum LightBakeMode { - LIGHT_BAKE_DISABLED, - LIGHT_BAKE_ENABLE, - LIGHT_BAKE_LIGHTMAPS + enum MeshOverride { + MESH_OVERRIDE_DEFAULT, + MESH_OVERRIDE_ENABLE, + MESH_OVERRIDE_DISABLE, }; void _replace_owner(Node *p_node, Node *p_scene, Node *p_new_owner); - void _generate_meshes(Node *p_node, bool p_generate_lods, bool p_create_shadow_meshes); + void _generate_meshes(Node *p_node, const Dictionary &p_mesh_data, bool p_generate_lods, bool p_create_shadow_meshes, LightBakeMode p_light_bake_mode, float p_lightmap_texel_size, const Vector<uint8_t> &p_src_lightmap_cache, Vector<uint8_t> &r_dst_lightmap_cache); + void _add_shapes(Node *p_node, const List<Ref<Shape3D>> &p_shapes); public: static ResourceImporterScene *get_singleton() { return singleton; } @@ -141,26 +140,39 @@ public: virtual int get_preset_count() const override; virtual String get_preset_name(int p_idx) const override; + enum InternalImportCategory { + INTERNAL_IMPORT_CATEGORY_NODE, + INTERNAL_IMPORT_CATEGORY_MESH_3D_NODE, + INTERNAL_IMPORT_CATEGORY_MESH, + INTERNAL_IMPORT_CATEGORY_MATERIAL, + INTERNAL_IMPORT_CATEGORY_ANIMATION, + INTERNAL_IMPORT_CATEGORY_ANIMATION_NODE, + INTERNAL_IMPORT_CATEGORY_MAX + }; + + void get_internal_import_options(InternalImportCategory p_category, List<ImportOption> *r_options) const; + bool get_internal_option_visibility(InternalImportCategory p_category, const String &p_option, const Map<StringName, Variant> &p_options) const; + virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const override; virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const override; virtual int get_import_order() const override { return 100; } //after everything - void _find_meshes(Node *p_node, Map<Ref<ArrayMesh>, Transform> &meshes); + Node *_pre_fix_node(Node *p_node, Node *p_root, Map<Ref<EditorSceneImporterMesh>, List<Ref<Shape3D>>> &collision_map); + Node *_post_fix_node(Node *p_node, Node *p_root, Map<Ref<EditorSceneImporterMesh>, List<Ref<Shape3D>>> &collision_map, Set<Ref<EditorSceneImporterMesh>> &r_scanned_meshes, const Dictionary &p_node_data, const Dictionary &p_material_data, const Dictionary &p_animation_data, float p_animation_fps); - void _make_external_resources(Node *p_node, const String &p_base_path, bool p_make_animations, bool p_animations_as_text, bool p_keep_animations, bool p_make_materials, bool p_materials_as_text, bool p_keep_materials, bool p_make_meshes, bool p_meshes_as_text, Map<Ref<Animation>, Ref<Animation>> &p_animations, Map<Ref<Material>, Ref<Material>> &p_materials, Map<Ref<ArrayMesh>, Ref<ArrayMesh>> &p_meshes); - - Node *_fix_node(Node *p_node, Node *p_root, Map<Ref<Mesh>, List<Ref<Shape3D>>> &collision_map, LightBakeMode p_light_bake_mode); - - void _create_clips(Node *scene, const Array &p_clips, bool p_bake_all); - void _filter_anim_tracks(Ref<Animation> anim, Set<String> &keep); - void _filter_tracks(Node *scene, const String &p_text); - void _optimize_animations(Node *scene, float p_max_lin_error, float p_max_ang_error, float p_max_angle); + Ref<Animation> _save_animation_to_file(Ref<Animation> anim, bool p_save_to_file, String p_save_to_path, bool p_keep_custom_tracks); + void _create_clips(AnimationPlayer *anim, const Array &p_clips, bool p_bake_all); + void _optimize_animations(AnimationPlayer *anim, float p_max_lin_error, float p_max_ang_error, float p_max_angle); + Node *pre_import(const String &p_source_file); virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr) override; Node *import_scene_from_other_importer(EditorSceneImporter *p_exception, const String &p_path, uint32_t p_flags, int p_bake_fps); Ref<Animation> import_animation_from_other_importer(EditorSceneImporter *p_exception, const String &p_path, uint32_t p_flags, int p_bake_fps); + virtual bool has_advanced_options() const override; + virtual void show_advanced_options(const String &p_path) override; + ResourceImporterScene(); }; diff --git a/editor/import/resource_importer_texture.cpp b/editor/import/resource_importer_texture.cpp index eb16e873e6..de8031af35 100644 --- a/editor/import/resource_importer_texture.cpp +++ b/editor/import/resource_importer_texture.cpp @@ -172,7 +172,7 @@ bool ResourceImporterTexture::get_option_visibility(const String &p_option, cons if (compress_mode < COMPRESS_VRAM_COMPRESSED) { return false; } - if (!ProjectSettings::get_singleton()->get("rendering/vram_compression/import_bptc")) { + if (!ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_bptc")) { return false; } } @@ -473,8 +473,8 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String bool ok_on_pc = false; bool is_hdr = (image->get_format() >= Image::FORMAT_RF && image->get_format() <= Image::FORMAT_RGBE9995); bool is_ldr = (image->get_format() >= Image::FORMAT_L8 && image->get_format() <= Image::FORMAT_RGB565); - bool can_bptc = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_bptc"); - bool can_s3tc = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_s3tc"); + bool can_bptc = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_bptc"); + bool can_s3tc = ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_s3tc"); if (can_bptc) { //add to the list anyway @@ -524,19 +524,19 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String ok_on_pc = true; } - if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc2")) { + if (ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc2")) { _save_stex(image, p_save_path + ".etc2.stex", compress_mode, lossy, Image::COMPRESS_ETC2, mipmaps, stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, true, mipmap_limit, normal_image, roughness_channel); r_platform_variants->push_back("etc2"); formats_imported.push_back("etc2"); } - if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc")) { + if (ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_etc")) { _save_stex(image, p_save_path + ".etc.stex", compress_mode, lossy, Image::COMPRESS_ETC, mipmaps, stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, true, mipmap_limit, normal_image, roughness_channel); r_platform_variants->push_back("etc"); formats_imported.push_back("etc"); } - if (ProjectSettings::get_singleton()->get("rendering/vram_compression/import_pvrtc")) { + if (ProjectSettings::get_singleton()->get("rendering/textures/vram_compression/import_pvrtc")) { _save_stex(image, p_save_path + ".pvrtc.stex", compress_mode, lossy, Image::COMPRESS_PVRTC1_4, mipmaps, stream, detect_3d, detect_roughness, detect_normal, force_normal, srgb_friendly_pack, true, mipmap_limit, normal_image, roughness_channel); r_platform_variants->push_back("pvrtc"); formats_imported.push_back("pvrtc"); @@ -574,7 +574,7 @@ String ResourceImporterTexture::get_import_settings_string() const { int index = 0; while (compression_formats[index]) { - String setting_path = "rendering/vram_compression/import_" + String(compression_formats[index]); + String setting_path = "rendering/textures/vram_compression/import_" + String(compression_formats[index]); bool test = ProjectSettings::get_singleton()->get(setting_path); if (test) { s += String(compression_formats[index]); @@ -606,7 +606,7 @@ bool ResourceImporterTexture::are_import_settings_valid(const String &p_path) co int index = 0; bool valid = true; while (compression_formats[index]) { - String setting_path = "rendering/vram_compression/import_" + String(compression_formats[index]); + String setting_path = "rendering/textures/vram_compression/import_" + String(compression_formats[index]); bool test = ProjectSettings::get_singleton()->get(setting_path); if (test) { if (formats_imported.find(compression_formats[index]) == -1) { diff --git a/editor/import/scene_import_settings.cpp b/editor/import/scene_import_settings.cpp new file mode 100644 index 0000000000..48340ac242 --- /dev/null +++ b/editor/import/scene_import_settings.cpp @@ -0,0 +1,1199 @@ +/*************************************************************************/ +/* scene_import_settings.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2021 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 "scene_import_settings.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" +#include "editor/import/scene_importer_mesh_node_3d.h" +#include "scene/resources/surface_tool.h" + +class SceneImportSettingsData : public Object { + GDCLASS(SceneImportSettingsData, Object) + friend class SceneImportSettings; + Map<StringName, Variant> *settings = nullptr; + Map<StringName, Variant> current; + Map<StringName, Variant> defaults; + List<ResourceImporter::ImportOption> options; + + ResourceImporterScene::InternalImportCategory category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MAX; + + bool _set(const StringName &p_name, const Variant &p_value) { + if (settings) { + if (defaults.has(p_name) && defaults[p_name] == p_value) { + settings->erase(p_name); + } else { + (*settings)[p_name] = p_value; + } + + current[p_name] = p_value; + return true; + } + return false; + } + bool _get(const StringName &p_name, Variant &r_ret) const { + if (settings) { + if (settings->has(p_name)) { + r_ret = (*settings)[p_name]; + return true; + } + } + if (defaults.has(p_name)) { + r_ret = defaults[p_name]; + return true; + } + return false; + } + void _get_property_list(List<PropertyInfo> *p_list) const { + for (const List<ResourceImporter::ImportOption>::Element *E = options.front(); E; E = E->next()) { + if (ResourceImporterScene::get_singleton()->get_internal_option_visibility(category, E->get().option.name, current)) { + p_list->push_back(E->get().option); + } + } + } +}; + +void SceneImportSettings::_fill_material(Tree *p_tree, const Ref<Material> &p_material, TreeItem *p_parent) { + String import_id; + bool has_import_id = false; + + if (p_material->has_meta("import_id")) { + import_id = p_material->get_meta("import_id"); + has_import_id = true; + } else if (p_material->get_name() != "") { + import_id = p_material->get_name(); + has_import_id = true; + } else { + import_id = "@MATERIAL:" + itos(material_set.size()); + } + + if (!material_map.has(import_id)) { + MaterialData md; + md.has_import_id = has_import_id; + md.material = p_material; + + _load_default_subresource_settings(md.settings, "materials", import_id, ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MATERIAL); + + material_map[import_id] = md; + } + + MaterialData &material_data = material_map[import_id]; + + Ref<Texture2D> icon = get_theme_icon("StandardMaterial3D", "EditorIcons"); + + TreeItem *item = p_tree->create_item(p_parent); + item->set_text(0, p_material->get_name()); + item->set_icon(0, icon); + + bool created = false; + if (!material_set.has(p_material)) { + material_set.insert(p_material); + created = true; + } + + item->set_meta("type", "Material"); + item->set_meta("import_id", import_id); + item->set_tooltip(0, vformat(TTR("Import ID: %s"), import_id)); + item->set_selectable(0, true); + + if (p_tree == scene_tree) { + material_data.scene_node = item; + } else if (p_tree == mesh_tree) { + material_data.mesh_node = item; + } else { + material_data.material_node = item; + } + + if (created) { + _fill_material(material_tree, p_material, material_tree->get_root()); + } +} + +void SceneImportSettings::_fill_mesh(Tree *p_tree, const Ref<Mesh> &p_mesh, TreeItem *p_parent) { + String import_id; + + bool has_import_id = false; + if (p_mesh->has_meta("import_id")) { + import_id = p_mesh->get_meta("import_id"); + has_import_id = true; + } else if (p_mesh->get_name() != String()) { + import_id = p_mesh->get_name(); + has_import_id = true; + } else { + import_id = "@MESH:" + itos(mesh_set.size()); + } + + if (!mesh_map.has(import_id)) { + MeshData md; + md.has_import_id = has_import_id; + md.mesh = p_mesh; + + _load_default_subresource_settings(md.settings, "meshes", import_id, ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MESH); + + mesh_map[import_id] = md; + } + + MeshData &mesh_data = mesh_map[import_id]; + + Ref<Texture2D> icon = get_theme_icon("Mesh", "EditorIcons"); + + TreeItem *item = p_tree->create_item(p_parent); + item->set_text(0, p_mesh->get_name()); + item->set_icon(0, icon); + + bool created = false; + if (!mesh_set.has(p_mesh)) { + mesh_set.insert(p_mesh); + created = true; + } + + item->set_meta("type", "Mesh"); + item->set_meta("import_id", import_id); + item->set_tooltip(0, vformat(TTR("Import ID: %s"), import_id)); + + item->set_selectable(0, true); + + if (p_tree == scene_tree) { + mesh_data.scene_node = item; + } else { + mesh_data.mesh_node = item; + } + + item->set_collapsed(true); + + for (int i = 0; i < p_mesh->get_surface_count(); i++) { + Ref<Material> mat = p_mesh->surface_get_material(i); + if (mat.is_valid()) { + _fill_material(p_tree, mat, item); + } + } + + if (created) { + _fill_mesh(mesh_tree, p_mesh, mesh_tree->get_root()); + } +} + +void SceneImportSettings::_fill_animation(Tree *p_tree, const Ref<Animation> &p_anim, const String &p_name, TreeItem *p_parent) { + if (!animation_map.has(p_name)) { + AnimationData ad; + ad.animation = p_anim; + + _load_default_subresource_settings(ad.settings, "animations", p_name, ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_ANIMATION); + + animation_map[p_name] = ad; + } + + AnimationData &animation_data = animation_map[p_name]; + + Ref<Texture2D> icon = get_theme_icon("Animation", "EditorIcons"); + + TreeItem *item = p_tree->create_item(p_parent); + item->set_text(0, p_name); + item->set_icon(0, icon); + + item->set_meta("type", "Animation"); + item->set_meta("import_id", p_name); + + item->set_selectable(0, true); + + animation_data.scene_node = item; +} + +void SceneImportSettings::_fill_scene(Node *p_node, TreeItem *p_parent_item) { + String import_id; + + if (p_node->has_meta("import_id")) { + import_id = p_node->get_meta("import_id"); + } else { + import_id = "PATH:" + String(scene->get_path_to(p_node)); + p_node->set_meta("import_id", import_id); + } + + EditorSceneImporterMeshNode3D *src_mesh_node = Object::cast_to<EditorSceneImporterMeshNode3D>(p_node); + + if (src_mesh_node) { + MeshInstance3D *mesh_node = memnew(MeshInstance3D); + mesh_node->set_name(src_mesh_node->get_name()); + mesh_node->set_transform(src_mesh_node->get_transform()); + mesh_node->set_skin(src_mesh_node->get_skin()); + mesh_node->set_skeleton_path(src_mesh_node->get_skeleton_path()); + if (src_mesh_node->get_mesh().is_valid()) { + Ref<EditorSceneImporterMesh> editor_mesh = src_mesh_node->get_mesh(); + mesh_node->set_mesh(editor_mesh->get_mesh()); + } + + p_node->replace_by(mesh_node); + memdelete(p_node); + p_node = mesh_node; + } + + String type = p_node->get_class(); + + if (!has_theme_icon(type, "EditorIcons")) { + type = "Node3D"; + } + + Ref<Texture2D> icon = get_theme_icon(type, "EditorIcons"); + + TreeItem *item = scene_tree->create_item(p_parent_item); + item->set_text(0, p_node->get_name()); + + if (p_node == scene) { + icon = get_theme_icon("PackedScene", "EditorIcons"); + item->set_text(0, "Scene"); + } + + item->set_icon(0, icon); + + item->set_meta("type", "Node"); + item->set_meta("class", type); + item->set_meta("import_id", import_id); + item->set_tooltip(0, vformat(TTR("Type: %s\nImport ID: %s"), type, import_id)); + + item->set_selectable(0, true); + + if (!node_map.has(import_id)) { + NodeData nd; + + if (p_node != scene) { + ResourceImporterScene::InternalImportCategory category; + if (src_mesh_node) { + category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MESH_3D_NODE; + } else if (Object::cast_to<AnimationPlayer>(p_node)) { + category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_ANIMATION_NODE; + } else { + category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_NODE; + } + + _load_default_subresource_settings(nd.settings, "nodes", import_id, category); + } + + node_map[import_id] = nd; + } + NodeData &node_data = node_map[import_id]; + + node_data.node = p_node; + node_data.scene_node = item; + + AnimationPlayer *anim_node = Object::cast_to<AnimationPlayer>(p_node); + if (anim_node) { + List<StringName> animations; + anim_node->get_animation_list(&animations); + for (List<StringName>::Element *E = animations.front(); E; E = E->next()) { + _fill_animation(scene_tree, anim_node->get_animation(E->get()), E->get(), item); + } + } + + for (int i = 0; i < p_node->get_child_count(); i++) { + _fill_scene(p_node->get_child(i), item); + } + MeshInstance3D *mesh_node = Object::cast_to<MeshInstance3D>(p_node); + if (mesh_node && mesh_node->get_mesh().is_valid()) { + _fill_mesh(scene_tree, mesh_node->get_mesh(), item); + + Transform accum_xform; + Node3D *base = mesh_node; + while (base) { + accum_xform = base->get_transform() * accum_xform; + base = Object::cast_to<Node3D>(base->get_parent()); + } + + AABB aabb = accum_xform.xform(mesh_node->get_mesh()->get_aabb()); + if (first_aabb) { + contents_aabb = aabb; + first_aabb = false; + } else { + contents_aabb.merge_with(aabb); + } + } +} + +void SceneImportSettings::_update_scene() { + scene_tree->clear(); + material_tree->clear(); + mesh_tree->clear(); + + //hiden roots + material_tree->create_item(); + mesh_tree->create_item(); + + _fill_scene(scene, nullptr); +} + +void SceneImportSettings::_update_camera() { + AABB camera_aabb; + + float rot_x = cam_rot_x; + float rot_y = cam_rot_y; + float zoom = cam_zoom; + + if (selected_type == "Node" || selected_type == "") { + camera_aabb = contents_aabb; + } else { + if (mesh_preview->get_mesh().is_valid()) { + camera_aabb = mesh_preview->get_transform().xform(mesh_preview->get_mesh()->get_aabb()); + } else { + camera_aabb = AABB(Vector3(-1, -1, -1), Vector3(2, 2, 2)); + } + if (selected_type == "Mesh" && mesh_map.has(selected_id)) { + const MeshData &md = mesh_map[selected_id]; + rot_x = md.cam_rot_x; + rot_y = md.cam_rot_y; + zoom = md.cam_zoom; + } else if (selected_type == "Material" && material_map.has(selected_id)) { + const MaterialData &md = material_map[selected_id]; + rot_x = md.cam_rot_x; + rot_y = md.cam_rot_y; + zoom = md.cam_zoom; + } + } + + Vector3 center = camera_aabb.position + camera_aabb.size * 0.5; + float camera_size = camera_aabb.get_longest_axis_size(); + + camera->set_orthogonal(camera_size * zoom, 0.0001, camera_size * 2); + + Transform xf; + xf.basis = Basis(Vector3(0, 1, 0), rot_y) * Basis(Vector3(1, 0, 0), rot_x); + xf.origin = center; + xf.translate(0, 0, camera_size); + + camera->set_transform(xf); +} + +void SceneImportSettings::_load_default_subresource_settings(Map<StringName, Variant> &settings, const String &p_type, const String &p_import_id, ResourceImporterScene::InternalImportCategory p_category) { + if (base_subresource_settings.has(p_type)) { + Dictionary d = base_subresource_settings[p_type]; + if (d.has(p_import_id)) { + d = d[p_import_id]; + List<ResourceImporterScene::ImportOption> options; + ResourceImporterScene::get_singleton()->get_internal_import_options(p_category, &options); + for (List<ResourceImporterScene::ImportOption>::Element *E = options.front(); E; E = E->next()) { + String key = E->get().option.name; + if (d.has(key)) { + settings[key] = d[key]; + } + } + } + } +} + +void SceneImportSettings::open_settings(const String &p_path) { + if (scene) { + memdelete(scene); + scene = nullptr; + } + scene = ResourceImporterScene::get_singleton()->pre_import(p_path); + if (scene == nullptr) { + EditorNode::get_singleton()->show_warning(TTR("Error opening scene")); + return; + } + + base_path = p_path; + + material_set.clear(); + mesh_set.clear(); + material_map.clear(); + mesh_map.clear(); + node_map.clear(); + defaults.clear(); + + selected_id = ""; + selected_type = ""; + + cam_rot_x = -Math_PI / 4; + cam_rot_y = -Math_PI / 4; + cam_zoom = 1; + + { + base_subresource_settings.clear(); + + Ref<ConfigFile> config; + config.instance(); + Error err = config->load(p_path + ".import"); + if (err == OK) { + List<String> keys; + config->get_section_keys("params", &keys); + for (List<String>::Element *E = keys.front(); E; E = E->next()) { + Variant value = config->get_value("params", E->get()); + if (E->get() == "_subresources") { + base_subresource_settings = value; + } else { + defaults[E->get()] = value; + } + } + } + } + + first_aabb = true; + + _update_scene(); + + base_viewport->add_child(scene); + + if (first_aabb) { + contents_aabb = AABB(Vector3(-1, -1, -1), Vector3(2, 2, 2)); + first_aabb = false; + } + + popup_centered_ratio(); + _update_camera(); + + set_title(vformat(TTR("Advanced Import Settings for '%s'"), base_path.get_file())); +} + +SceneImportSettings *SceneImportSettings::singleton = nullptr; + +SceneImportSettings *SceneImportSettings::get_singleton() { + return singleton; +} + +void SceneImportSettings::_select(Tree *p_from, String p_type, String p_id) { + selecting = true; + + if (p_type == "Node") { + node_selected->hide(); //always hide just in case + mesh_preview->hide(); + if (Object::cast_to<Node3D>(scene)) { + Object::cast_to<Node3D>(scene)->show(); + } + //NodeData &nd=node_map[p_id]; + material_tree->deselect_all(); + mesh_tree->deselect_all(); + NodeData &nd = node_map[p_id]; + + MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(nd.node); + if (mi) { + Ref<Mesh> base_mesh = mi->get_mesh(); + if (base_mesh.is_valid()) { + AABB aabb = base_mesh->get_aabb(); + Transform aabb_xf; + aabb_xf.basis.scale(aabb.size); + aabb_xf.origin = aabb.position; + + aabb_xf = mi->get_global_transform() * aabb_xf; + node_selected->set_transform(aabb_xf); + node_selected->show(); + } + } + + if (nd.node == scene) { + scene_import_settings_data->settings = &defaults; + scene_import_settings_data->category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MAX; + } else { + scene_import_settings_data->settings = &nd.settings; + if (mi) { + scene_import_settings_data->category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MESH_3D_NODE; + } else if (Object::cast_to<AnimationPlayer>(nd.node)) { + scene_import_settings_data->category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_ANIMATION_NODE; + } else { + scene_import_settings_data->category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_NODE; + } + } + } else if (p_type == "Animation") { + node_selected->hide(); //always hide just in case + mesh_preview->hide(); + if (Object::cast_to<Node3D>(scene)) { + Object::cast_to<Node3D>(scene)->show(); + } + //NodeData &nd=node_map[p_id]; + material_tree->deselect_all(); + mesh_tree->deselect_all(); + AnimationData &ad = animation_map[p_id]; + + scene_import_settings_data->settings = &ad.settings; + scene_import_settings_data->category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_ANIMATION; + } else if (p_type == "Mesh") { + node_selected->hide(); + if (Object::cast_to<Node3D>(scene)) { + Object::cast_to<Node3D>(scene)->hide(); + } + + MeshData &md = mesh_map[p_id]; + if (p_from != mesh_tree) { + md.mesh_node->uncollapse_tree(); + md.mesh_node->select(0); + mesh_tree->ensure_cursor_is_visible(); + } + if (p_from != scene_tree) { + md.scene_node->uncollapse_tree(); + md.scene_node->select(0); + scene_tree->ensure_cursor_is_visible(); + } + + mesh_preview->set_mesh(md.mesh); + mesh_preview->show(); + + material_tree->deselect_all(); + + scene_import_settings_data->settings = &md.settings; + scene_import_settings_data->category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MESH; + } else if (p_type == "Material") { + node_selected->hide(); + if (Object::cast_to<Node3D>(scene)) { + Object::cast_to<Node3D>(scene)->hide(); + } + + mesh_preview->show(); + + MaterialData &md = material_map[p_id]; + + material_preview->set_material(md.material); + mesh_preview->set_mesh(material_preview); + + if (p_from != mesh_tree) { + md.mesh_node->uncollapse_tree(); + md.mesh_node->select(0); + mesh_tree->ensure_cursor_is_visible(); + } + if (p_from != scene_tree) { + md.scene_node->uncollapse_tree(); + md.scene_node->select(0); + scene_tree->ensure_cursor_is_visible(); + } + if (p_from != material_tree) { + md.material_node->uncollapse_tree(); + md.material_node->select(0); + material_tree->ensure_cursor_is_visible(); + } + + scene_import_settings_data->settings = &md.settings; + scene_import_settings_data->category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MATERIAL; + } + + selected_type = p_type; + selected_id = p_id; + + selecting = false; + + _update_camera(); + + List<ResourceImporter::ImportOption> options; + + if (scene_import_settings_data->category == ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MAX) { + ResourceImporterScene::get_singleton()->get_import_options(&options); + } else { + ResourceImporterScene::get_singleton()->get_internal_import_options(scene_import_settings_data->category, &options); + } + + scene_import_settings_data->defaults.clear(); + scene_import_settings_data->current.clear(); + + for (List<ResourceImporter::ImportOption>::Element *E = options.front(); E; E = E->next()) { + scene_import_settings_data->defaults[E->get().option.name] = E->get().default_value; + //needed for visibility toggling (fails if something is missing) + if (scene_import_settings_data->settings->has(E->get().option.name)) { + scene_import_settings_data->current[E->get().option.name] = (*scene_import_settings_data->settings)[E->get().option.name]; + } else { + scene_import_settings_data->current[E->get().option.name] = E->get().default_value; + } + } + scene_import_settings_data->options = options; + inspector->edit(scene_import_settings_data); + scene_import_settings_data->notify_property_list_changed(); +} + +void SceneImportSettings::_material_tree_selected() { + if (selecting) { + return; + } + TreeItem *item = material_tree->get_selected(); + String type = item->get_meta("type"); + String import_id = item->get_meta("import_id"); + + _select(material_tree, type, import_id); +} +void SceneImportSettings::_mesh_tree_selected() { + if (selecting) { + return; + } + + TreeItem *item = mesh_tree->get_selected(); + String type = item->get_meta("type"); + String import_id = item->get_meta("import_id"); + + _select(mesh_tree, type, import_id); +} +void SceneImportSettings::_scene_tree_selected() { + if (selecting) { + return; + } + TreeItem *item = scene_tree->get_selected(); + String type = item->get_meta("type"); + String import_id = item->get_meta("import_id"); + + _select(scene_tree, type, import_id); +} + +void SceneImportSettings::_viewport_input(const Ref<InputEvent> &p_input) { + float *rot_x = &cam_rot_x; + float *rot_y = &cam_rot_y; + float *zoom = &cam_zoom; + + if (selected_type == "Mesh" && mesh_map.has(selected_id)) { + MeshData &md = mesh_map[selected_id]; + rot_x = &md.cam_rot_x; + rot_y = &md.cam_rot_y; + zoom = &md.cam_zoom; + } else if (selected_type == "Material" && material_map.has(selected_id)) { + MaterialData &md = material_map[selected_id]; + rot_x = &md.cam_rot_x; + rot_y = &md.cam_rot_y; + zoom = &md.cam_zoom; + } + Ref<InputEventMouseMotion> mm = p_input; + if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { + (*rot_x) -= mm->get_relative().y * 0.01 * EDSCALE; + (*rot_y) -= mm->get_relative().x * 0.01 * EDSCALE; + (*rot_x) = CLAMP((*rot_x), -Math_PI / 2, Math_PI / 2); + _update_camera(); + } + Ref<InputEventMouseButton> mb = p_input; + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { + (*zoom) *= 1.1; + if ((*zoom) > 10.0) { + (*zoom) = 10.0; + } + _update_camera(); + } + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { + (*zoom) /= 1.1; + if ((*zoom) < 0.1) { + (*zoom) = 0.1; + } + _update_camera(); + } +} + +void SceneImportSettings::_re_import() { + Map<StringName, Variant> main_settings; + + main_settings = defaults; + main_settings.erase("_subresources"); + Dictionary nodes; + Dictionary materials; + Dictionary meshes; + Dictionary animations; + + Dictionary subresources; + + for (Map<String, NodeData>::Element *E = node_map.front(); E; E = E->next()) { + if (E->get().settings.size()) { + Dictionary d; + for (Map<StringName, Variant>::Element *F = E->get().settings.front(); F; F = F->next()) { + d[String(F->key())] = F->get(); + } + nodes[E->key()] = d; + } + } + if (nodes.size()) { + subresources["nodes"] = nodes; + } + + for (Map<String, MaterialData>::Element *E = material_map.front(); E; E = E->next()) { + if (E->get().settings.size()) { + Dictionary d; + for (Map<StringName, Variant>::Element *F = E->get().settings.front(); F; F = F->next()) { + d[String(F->key())] = F->get(); + } + materials[E->key()] = d; + } + } + if (materials.size()) { + subresources["materials"] = materials; + } + + for (Map<String, MeshData>::Element *E = mesh_map.front(); E; E = E->next()) { + if (E->get().settings.size()) { + Dictionary d; + for (Map<StringName, Variant>::Element *F = E->get().settings.front(); F; F = F->next()) { + d[String(F->key())] = F->get(); + } + meshes[E->key()] = d; + } + } + if (meshes.size()) { + subresources["meshes"] = meshes; + } + + for (Map<String, AnimationData>::Element *E = animation_map.front(); E; E = E->next()) { + if (E->get().settings.size()) { + Dictionary d; + for (Map<StringName, Variant>::Element *F = E->get().settings.front(); F; F = F->next()) { + d[String(F->key())] = F->get(); + } + animations[E->key()] = d; + } + } + if (animations.size()) { + subresources["animations"] = animations; + } + + if (subresources.size()) { + main_settings["_subresources"] = subresources; + } + + EditorFileSystem::get_singleton()->reimport_file_with_custom_parameters(base_path, "scene", main_settings); +} + +void SceneImportSettings::_notification(int p_what) { + if (p_what == NOTIFICATION_READY) { + connect("confirmed", callable_mp(this, &SceneImportSettings::_re_import)); + } +} + +void SceneImportSettings::_menu_callback(int p_id) { + switch (p_id) { + case ACTION_EXTRACT_MATERIALS: { + save_path->set_text(TTR("Select folder to extract material resources")); + external_extension_type->select(0); + } break; + case ACTION_CHOOSE_MESH_SAVE_PATHS: { + save_path->set_text(TTR("Select folder where mesh resources will save on import")); + external_extension_type->select(1); + } break; + case ACTION_CHOOSE_ANIMATION_SAVE_PATHS: { + save_path->set_text(TTR("Select folder where animations will save on import")); + external_extension_type->select(1); + } break; + } + + save_path->set_current_dir(base_path.get_base_dir()); + current_action = p_id; + save_path->popup_centered_ratio(); +} + +void SceneImportSettings::_save_path_changed(const String &p_path) { + save_path_item->set_text(1, p_path); + + if (FileAccess::exists(p_path)) { + save_path_item->set_text(2, "Warning: File exists"); + save_path_item->set_tooltip(2, TTR("Existing file with the same name will be replaced.")); + save_path_item->set_icon(2, get_theme_icon("StatusWarning", "EditorIcons")); + + } else { + save_path_item->set_text(2, "Will create new File"); + save_path_item->set_icon(2, get_theme_icon("StatusSuccess", "EditorIcons")); + } +} + +void SceneImportSettings::_browse_save_callback(Object *p_item, int p_column, int p_id) { + TreeItem *item = Object::cast_to<TreeItem>(p_item); + + String path = item->get_text(1); + + item_save_path->set_current_file(path); + save_path_item = item; + + item_save_path->popup_centered_ratio(); +} + +void SceneImportSettings::_save_dir_callback(const String &p_path) { + external_path_tree->clear(); + TreeItem *root = external_path_tree->create_item(); + save_path_items.clear(); + + switch (current_action) { + case ACTION_EXTRACT_MATERIALS: { + for (Map<String, MaterialData>::Element *E = material_map.front(); E; E = E->next()) { + MaterialData &md = material_map[E->key()]; + + TreeItem *item = external_path_tree->create_item(root); + + String name = md.material_node->get_text(0); + + item->set_cell_mode(0, TreeItem::CELL_MODE_CHECK); + item->set_icon(0, get_theme_icon("StandardMaterial3D", "EditorIcons")); + item->set_text(0, name); + + if (md.has_import_id) { + if (md.settings.has("use_external/enabled") && bool(md.settings["use_external/enabled"])) { + item->set_text(2, "Already External"); + item->set_tooltip(2, TTR("This material already references an external file, no action will be taken.\nDisable the external property for it to be extracted again.")); + } else { + item->set_metadata(0, E->key()); + item->set_editable(0, true); + item->set_checked(0, true); + String path = p_path.plus_file(name); + if (external_extension_type->get_selected() == 0) { + path += ".tres"; + } else { + path += ".res"; + } + + item->set_text(1, path); + if (FileAccess::exists(path)) { + item->set_text(2, "Warning: File exists"); + item->set_tooltip(2, TTR("Existing file with the same name will be replaced.")); + item->set_icon(2, get_theme_icon("StatusWarning", "EditorIcons")); + + } else { + item->set_text(2, "Will create new File"); + item->set_icon(2, get_theme_icon("StatusSuccess", "EditorIcons")); + } + + item->add_button(1, get_theme_icon("Folder", "EditorIcons")); + } + + } else { + item->set_text(2, "No import ID"); + item->set_tooltip(2, TTR("Material has no name nor any other way to identify on re-import.\nPlease name it or ensure it is exported with an unique ID.")); + item->set_icon(2, get_theme_icon("StatusError", "EditorIcons")); + } + + save_path_items.push_back(item); + } + + external_paths->set_title(TTR("Extract Materials to Resource Files")); + external_paths->get_ok_button()->set_text(TTR("Extract")); + } break; + case ACTION_CHOOSE_MESH_SAVE_PATHS: { + for (Map<String, MeshData>::Element *E = mesh_map.front(); E; E = E->next()) { + MeshData &md = mesh_map[E->key()]; + + TreeItem *item = external_path_tree->create_item(root); + + String name = md.mesh_node->get_text(0); + + item->set_cell_mode(0, TreeItem::CELL_MODE_CHECK); + item->set_icon(0, get_theme_icon("Mesh", "EditorIcons")); + item->set_text(0, name); + + if (md.has_import_id) { + if (md.settings.has("save_to_file/enabled") && bool(md.settings["save_to_file/enabled"])) { + item->set_text(2, "Already Saving"); + item->set_tooltip(2, TTR("This mesh already saves to an external resource, no action will be taken.")); + } else { + item->set_metadata(0, E->key()); + item->set_editable(0, true); + item->set_checked(0, true); + String path = p_path.plus_file(name); + if (external_extension_type->get_selected() == 0) { + path += ".tres"; + } else { + path += ".res"; + } + + item->set_text(1, path); + if (FileAccess::exists(path)) { + item->set_text(2, "Warning: File exists"); + item->set_tooltip(2, TTR("Existing file with the same name will be replaced on import.")); + item->set_icon(2, get_theme_icon("StatusWarning", "EditorIcons")); + + } else { + item->set_text(2, "Will save to new File"); + item->set_icon(2, get_theme_icon("StatusSuccess", "EditorIcons")); + } + + item->add_button(1, get_theme_icon("Folder", "EditorIcons")); + } + + } else { + item->set_text(2, "No import ID"); + item->set_tooltip(2, TTR("Mesh has no name nor any other way to identify on re-import.\nPlease name it or ensure it is exported with an unique ID.")); + item->set_icon(2, get_theme_icon("StatusError", "EditorIcons")); + } + + save_path_items.push_back(item); + } + + external_paths->set_title(TTR("Set paths to save meshes as resource files on Reimport")); + external_paths->get_ok_button()->set_text(TTR("Set Paths")); + } break; + case ACTION_CHOOSE_ANIMATION_SAVE_PATHS: { + for (Map<String, AnimationData>::Element *E = animation_map.front(); E; E = E->next()) { + AnimationData &ad = animation_map[E->key()]; + + TreeItem *item = external_path_tree->create_item(root); + + String name = ad.scene_node->get_text(0); + + item->set_cell_mode(0, TreeItem::CELL_MODE_CHECK); + item->set_icon(0, get_theme_icon("Animation", "EditorIcons")); + item->set_text(0, name); + + if (ad.settings.has("save_to_file/enabled") && bool(ad.settings["save_to_file/enabled"])) { + item->set_text(2, "Already Saving"); + item->set_tooltip(2, TTR("This animation already saves to an external resource, no action will be taken.")); + } else { + item->set_metadata(0, E->key()); + item->set_editable(0, true); + item->set_checked(0, true); + String path = p_path.plus_file(name); + if (external_extension_type->get_selected() == 0) { + path += ".tres"; + } else { + path += ".res"; + } + + item->set_text(1, path); + if (FileAccess::exists(path)) { + item->set_text(2, "Warning: File exists"); + item->set_tooltip(2, TTR("Existing file with the same name will be replaced on import.")); + item->set_icon(2, get_theme_icon("StatusWarning", "EditorIcons")); + + } else { + item->set_text(2, "Will save to new File"); + item->set_icon(2, get_theme_icon("StatusSuccess", "EditorIcons")); + } + + item->add_button(1, get_theme_icon("Folder", "EditorIcons")); + } + + save_path_items.push_back(item); + } + + external_paths->set_title(TTR("Set paths to save animations as resource files on Reimport")); + external_paths->get_ok_button()->set_text(TTR("Set Paths")); + + } break; + } + + external_paths->popup_centered_ratio(); +} + +void SceneImportSettings::_save_dir_confirm() { + for (int i = 0; i < save_path_items.size(); i++) { + TreeItem *item = save_path_items[i]; + if (!item->is_checked(0)) { + continue; //ignore + } + String path = item->get_text(1); + if (!path.is_resource_file()) { + continue; + } + + String id = item->get_metadata(0); + + switch (current_action) { + case ACTION_EXTRACT_MATERIALS: { + ERR_CONTINUE(!material_map.has(id)); + MaterialData &md = material_map[id]; + + Error err = ResourceSaver::save(path, md.material); + if (err != OK) { + EditorNode::get_singleton()->add_io_error(TTR("Can't make material external to file, write error:") + "\n\t" + path); + continue; + } + + md.settings["use_external/enabled"] = true; + md.settings["use_external/path"] = path; + + } break; + case ACTION_CHOOSE_MESH_SAVE_PATHS: { + ERR_CONTINUE(!mesh_map.has(id)); + MeshData &md = mesh_map[id]; + + md.settings["save_to_file/enabled"] = true; + md.settings["save_to_file/path"] = path; + } break; + case ACTION_CHOOSE_ANIMATION_SAVE_PATHS: { + ERR_CONTINUE(!animation_map.has(id)); + AnimationData &ad = animation_map[id]; + + ad.settings["save_to_file/enabled"] = true; + ad.settings["save_to_file/path"] = path; + + } break; + } + } + + if (current_action == ACTION_EXTRACT_MATERIALS) { + //as this happens right now, the scene needs to be saved and reimported. + _re_import(); + open_settings(base_path); + } else { + scene_import_settings_data->notify_property_list_changed(); + } +} + +SceneImportSettings::SceneImportSettings() { + singleton = this; + + VBoxContainer *main_vb = memnew(VBoxContainer); + add_child(main_vb); + HBoxContainer *menu_hb = memnew(HBoxContainer); + main_vb->add_child(menu_hb); + + action_menu = memnew(MenuButton); + action_menu->set_text(TTR("Actions...")); + menu_hb->add_child(action_menu); + + action_menu->get_popup()->add_item(TTR("Extract Materials"), ACTION_EXTRACT_MATERIALS); + action_menu->get_popup()->add_separator(); + action_menu->get_popup()->add_item(TTR("Set Animation Save Paths"), ACTION_CHOOSE_ANIMATION_SAVE_PATHS); + action_menu->get_popup()->add_item(TTR("Set Mesh Save Paths"), ACTION_CHOOSE_MESH_SAVE_PATHS); + + action_menu->get_popup()->connect("id_pressed", callable_mp(this, &SceneImportSettings::_menu_callback)); + + tree_split = memnew(HSplitContainer); + main_vb->add_child(tree_split); + tree_split->set_v_size_flags(Control::SIZE_EXPAND_FILL); + + data_mode = memnew(TabContainer); + tree_split->add_child(data_mode); + data_mode->set_custom_minimum_size(Size2(300 * EDSCALE, 0)); + + property_split = memnew(HSplitContainer); + tree_split->add_child(property_split); + property_split->set_h_size_flags(Control::SIZE_EXPAND_FILL); + + scene_tree = memnew(Tree); + scene_tree->set_name(TTR("Scene")); + data_mode->add_child(scene_tree); + scene_tree->connect("cell_selected", callable_mp(this, &SceneImportSettings::_scene_tree_selected)); + + mesh_tree = memnew(Tree); + mesh_tree->set_name(TTR("Meshes")); + data_mode->add_child(mesh_tree); + mesh_tree->set_hide_root(true); + mesh_tree->connect("cell_selected", callable_mp(this, &SceneImportSettings::_mesh_tree_selected)); + + material_tree = memnew(Tree); + material_tree->set_name(TTR("Materials")); + data_mode->add_child(material_tree); + material_tree->connect("cell_selected", callable_mp(this, &SceneImportSettings::_material_tree_selected)); + + material_tree->set_hide_root(true); + + SubViewportContainer *vp_container = memnew(SubViewportContainer); + vp_container->set_h_size_flags(Control::SIZE_EXPAND_FILL); + vp_container->set_custom_minimum_size(Size2(10, 10)); + vp_container->set_stretch(true); + vp_container->connect("gui_input", callable_mp(this, &SceneImportSettings::_viewport_input)); + property_split->add_child(vp_container); + + base_viewport = memnew(SubViewport); + vp_container->add_child(base_viewport); + + base_viewport->set_use_own_world_3d(true); + + camera = memnew(Camera3D); + base_viewport->add_child(camera); + camera->make_current(); + + light = memnew(DirectionalLight3D); + light->set_transform(Transform().looking_at(Vector3(-1, -2, -0.6), Vector3(0, 1, 0))); + base_viewport->add_child(light); + light->set_shadow(true); + + { + Ref<StandardMaterial3D> selection_mat; + selection_mat.instance(); + selection_mat->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED); + selection_mat->set_albedo(Color(1, 0.8, 1.0)); + + Ref<SurfaceTool> st; + st.instance(); + st->begin(Mesh::PRIMITIVE_LINES); + + AABB base_aabb; + base_aabb.size = Vector3(1, 1, 1); + + for (int i = 0; i < 12; i++) { + Vector3 a, b; + base_aabb.get_edge(i, a, b); + + st->add_vertex(a); + st->add_vertex(a.lerp(b, 0.2)); + st->add_vertex(b); + st->add_vertex(b.lerp(a, 0.2)); + } + + selection_mesh.instance(); + st->commit(selection_mesh); + selection_mesh->surface_set_material(0, selection_mat); + + node_selected = memnew(MeshInstance3D); + node_selected->set_mesh(selection_mesh); + base_viewport->add_child(node_selected); + node_selected->hide(); + } + + { + mesh_preview = memnew(MeshInstance3D); + base_viewport->add_child(mesh_preview); + mesh_preview->hide(); + + material_preview.instance(); + } + + inspector = memnew(EditorInspector); + inspector->set_custom_minimum_size(Size2(300 * EDSCALE, 0)); + + property_split->add_child(inspector); + + scene_import_settings_data = memnew(SceneImportSettingsData); + + get_ok_button()->set_text(TTR("Reimport")); + get_cancel_button()->set_text(TTR("Close")); + + external_paths = memnew(ConfirmationDialog); + add_child(external_paths); + external_path_tree = memnew(Tree); + external_paths->add_child(external_path_tree); + external_path_tree->connect("button_pressed", callable_mp(this, &SceneImportSettings::_browse_save_callback)); + external_paths->connect("confirmed", callable_mp(this, &SceneImportSettings::_save_dir_confirm)); + external_path_tree->set_columns(3); + external_path_tree->set_column_titles_visible(true); + external_path_tree->set_column_expand(0, true); + external_path_tree->set_column_min_width(0, 100 * EDSCALE); + external_path_tree->set_column_title(0, TTR("Resource")); + external_path_tree->set_column_expand(1, true); + external_path_tree->set_column_min_width(1, 100 * EDSCALE); + external_path_tree->set_column_title(1, TTR("Path")); + external_path_tree->set_column_expand(2, false); + external_path_tree->set_column_min_width(2, 200 * EDSCALE); + external_path_tree->set_column_title(2, TTR("Status")); + save_path = memnew(EditorFileDialog); + save_path->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_DIR); + HBoxContainer *extension_hb = memnew(HBoxContainer); + save_path->get_vbox()->add_child(extension_hb); + extension_hb->add_spacer(); + extension_hb->add_child(memnew(Label(TTR("Save Extension: ")))); + external_extension_type = memnew(OptionButton); + extension_hb->add_child(external_extension_type); + external_extension_type->add_item(TTR("Text: *.tres")); + external_extension_type->add_item(TTR("Binary: *.res")); + external_path_tree->set_hide_root(true); + add_child(save_path); + + item_save_path = memnew(EditorFileDialog); + item_save_path->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE); + item_save_path->add_filter("*.tres;Text Resource"); + item_save_path->add_filter("*.res;Binary Resource"); + add_child(item_save_path); + item_save_path->connect("file_selected", callable_mp(this, &SceneImportSettings::_save_path_changed)); + + save_path->connect("dir_selected", callable_mp(this, &SceneImportSettings::_save_dir_callback)); +} + +SceneImportSettings::~SceneImportSettings() { + memdelete(scene_import_settings_data); +} diff --git a/editor/import/scene_import_settings.h b/editor/import/scene_import_settings.h new file mode 100644 index 0000000000..ddcf4a6d5d --- /dev/null +++ b/editor/import/scene_import_settings.h @@ -0,0 +1,199 @@ +/*************************************************************************/ +/* scene_import_settings.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2021 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 SCENEIMPORTSETTINGS_H +#define SCENEIMPORTSETTINGS_H + +#include "editor/editor_file_dialog.h" +#include "editor/editor_inspector.h" +#include "editor/import/resource_importer_scene.h" +#include "scene/3d/camera_3d.h" +#include "scene/3d/light_3d.h" +#include "scene/3d/mesh_instance_3d.h" +#include "scene/gui/dialogs.h" +#include "scene/gui/item_list.h" +#include "scene/gui/menu_button.h" +#include "scene/gui/option_button.h" +#include "scene/gui/split_container.h" +#include "scene/gui/subviewport_container.h" +#include "scene/gui/tab_container.h" +#include "scene/gui/tree.h" +#include "scene/resources/primitive_meshes.h" + +class SceneImportSettingsData; + +class SceneImportSettings : public ConfirmationDialog { + GDCLASS(SceneImportSettings, ConfirmationDialog) + + static SceneImportSettings *singleton; + + enum Actions { + ACTION_EXTRACT_MATERIALS, + ACTION_CHOOSE_MESH_SAVE_PATHS, + ACTION_CHOOSE_ANIMATION_SAVE_PATHS, + }; + + Node *scene = nullptr; + + HSplitContainer *tree_split; + HSplitContainer *property_split; + TabContainer *data_mode; + Tree *scene_tree; + Tree *mesh_tree; + Tree *material_tree; + + EditorInspector *inspector; + + SubViewport *base_viewport; + + Camera3D *camera; + bool first_aabb = false; + AABB contents_aabb; + + DirectionalLight3D *light; + Ref<ArrayMesh> selection_mesh; + MeshInstance3D *node_selected; + + MeshInstance3D *mesh_preview; + Ref<SphereMesh> material_preview; + + float cam_rot_x; + float cam_rot_y; + float cam_zoom; + + void _update_scene(); + + struct MaterialData { + bool has_import_id; + Ref<Material> material; + TreeItem *scene_node; + TreeItem *mesh_node; + TreeItem *material_node; + + float cam_rot_x = -Math_PI / 4; + float cam_rot_y = -Math_PI / 4; + float cam_zoom = 1; + + Map<StringName, Variant> settings; + }; + Map<String, MaterialData> material_map; + + struct MeshData { + bool has_import_id; + Ref<Mesh> mesh; + TreeItem *scene_node; + TreeItem *mesh_node; + + float cam_rot_x = -Math_PI / 4; + float cam_rot_y = -Math_PI / 4; + float cam_zoom = 1; + Map<StringName, Variant> settings; + }; + Map<String, MeshData> mesh_map; + + struct AnimationData { + Ref<Animation> animation; + TreeItem *scene_node; + Map<StringName, Variant> settings; + }; + Map<String, AnimationData> animation_map; + + struct NodeData { + Node *node; + TreeItem *scene_node; + Map<StringName, Variant> settings; + }; + Map<String, NodeData> node_map; + + void _fill_material(Tree *p_tree, const Ref<Material> &p_material, TreeItem *p_parent); + void _fill_mesh(Tree *p_tree, const Ref<Mesh> &p_mesh, TreeItem *p_parent); + void _fill_animation(Tree *p_tree, const Ref<Animation> &p_anim, const String &p_name, TreeItem *p_parent); + void _fill_scene(Node *p_node, TreeItem *p_parent_item); + + Set<Ref<Mesh>> mesh_set; + Set<Ref<Material>> material_set; + + String selected_type; + String selected_id; + + bool selecting = false; + + void _update_camera(); + void _select(Tree *p_from, String p_type, String p_id); + void _material_tree_selected(); + void _mesh_tree_selected(); + void _scene_tree_selected(); + + void _viewport_input(const Ref<InputEvent> &p_input); + + Map<StringName, Variant> defaults; + + SceneImportSettingsData *scene_import_settings_data; + + void _re_import(); + + String base_path; + + MenuButton *action_menu; + + ConfirmationDialog *external_paths; + Tree *external_path_tree; + EditorFileDialog *save_path; + OptionButton *external_extension_type; + + EditorFileDialog *item_save_path; + + void _menu_callback(int p_id); + void _save_dir_callback(const String &p_path); + + int current_action; + + Vector<TreeItem *> save_path_items; + + TreeItem *save_path_item = nullptr; + void _save_path_changed(const String &p_path); + void _browse_save_callback(Object *p_item, int p_column, int p_id); + void _save_dir_confirm(); + + Dictionary base_subresource_settings; + + void _load_default_subresource_settings(Map<StringName, Variant> &settings, const String &p_type, const String &p_import_id, ResourceImporterScene::InternalImportCategory p_category); + +protected: + void _notification(int p_what); + +public: + void open_settings(const String &p_path); + static SceneImportSettings *get_singleton(); + SceneImportSettings(); + ~SceneImportSettings(); +}; + +#endif // SCENEIMPORTSETTINGS_H diff --git a/editor/import/scene_importer_mesh.cpp b/editor/import/scene_importer_mesh.cpp index 78a7cd84f1..28fdd4ddbd 100644 --- a/editor/import/scene_importer_mesh.cpp +++ b/editor/import/scene_importer_mesh.cpp @@ -136,6 +136,11 @@ Ref<Material> EditorSceneImporterMesh::get_surface_material(int p_surface) const return surfaces[p_surface].material; } +void EditorSceneImporterMesh::set_surface_material(int p_surface, const Ref<Material> &p_material) { + ERR_FAIL_INDEX(p_surface, surfaces.size()); + surfaces.write[p_surface].material = p_material; +} + void EditorSceneImporterMesh::generate_lods() { if (!SurfaceTool::simplify_func) { return; @@ -219,11 +224,20 @@ bool EditorSceneImporterMesh::has_mesh() const { return mesh.is_valid(); } -Ref<ArrayMesh> EditorSceneImporterMesh::get_mesh() { +Ref<ArrayMesh> EditorSceneImporterMesh::get_mesh(const Ref<Mesh> &p_base) { ERR_FAIL_COND_V(surfaces.size() == 0, Ref<ArrayMesh>()); if (mesh.is_null()) { - mesh.instance(); + if (p_base.is_valid()) { + mesh = p_base; + } + if (mesh.is_null()) { + mesh.instance(); + } + mesh->set_name(get_name()); + if (has_meta("import_id")) { + mesh->set_meta("import_id", get_meta("import_id")); + } for (int i = 0; i < blend_shapes.size(); i++) { mesh->add_blend_shape(blend_shapes[i]); } @@ -251,6 +265,8 @@ Ref<ArrayMesh> EditorSceneImporterMesh::get_mesh() { } } + mesh->set_lightmap_size_hint(lightmap_size_hint); + if (shadow_mesh.is_valid()) { Ref<ArrayMesh> shadow = shadow_mesh->get_mesh(); mesh->set_shadow_mesh(shadow); @@ -436,6 +452,338 @@ Dictionary EditorSceneImporterMesh::_get_data() const { return data; } +Vector<Face3> EditorSceneImporterMesh::get_faces() const { + Vector<Face3> faces; + for (int i = 0; i < surfaces.size(); i++) { + if (surfaces[i].primitive == Mesh::PRIMITIVE_TRIANGLES) { + Vector<Vector3> vertices = surfaces[i].arrays[Mesh::ARRAY_VERTEX]; + Vector<int> indices = surfaces[i].arrays[Mesh::ARRAY_INDEX]; + if (indices.size()) { + for (int j = 0; j < indices.size(); j += 3) { + Face3 f; + f.vertex[0] = vertices[indices[j + 0]]; + f.vertex[1] = vertices[indices[j + 1]]; + f.vertex[2] = vertices[indices[j + 2]]; + faces.push_back(f); + } + } else { + for (int j = 0; j < vertices.size(); j += 3) { + Face3 f; + f.vertex[0] = vertices[j + 0]; + f.vertex[1] = vertices[j + 1]; + f.vertex[2] = vertices[j + 2]; + faces.push_back(f); + } + } + } + } + + return faces; +} + +Vector<Ref<Shape3D>> EditorSceneImporterMesh::convex_decompose() const { + ERR_FAIL_COND_V(!Mesh::convex_composition_function, Vector<Ref<Shape3D>>()); + + const Vector<Face3> faces = get_faces(); + + Vector<Vector<Face3>> decomposed = Mesh::convex_composition_function(faces); + + Vector<Ref<Shape3D>> ret; + + for (int i = 0; i < decomposed.size(); i++) { + Set<Vector3> points; + for (int j = 0; j < decomposed[i].size(); j++) { + points.insert(decomposed[i][j].vertex[0]); + points.insert(decomposed[i][j].vertex[1]); + points.insert(decomposed[i][j].vertex[2]); + } + + Vector<Vector3> convex_points; + convex_points.resize(points.size()); + { + Vector3 *w = convex_points.ptrw(); + int idx = 0; + for (Set<Vector3>::Element *E = points.front(); E; E = E->next()) { + w[idx++] = E->get(); + } + } + + Ref<ConvexPolygonShape3D> shape; + shape.instance(); + shape->set_points(convex_points); + ret.push_back(shape); + } + + return ret; +} + +Ref<Shape3D> EditorSceneImporterMesh::create_trimesh_shape() const { + Vector<Face3> faces = get_faces(); + if (faces.size() == 0) { + return Ref<Shape3D>(); + } + + Vector<Vector3> face_points; + face_points.resize(faces.size() * 3); + + for (int i = 0; i < face_points.size(); i += 3) { + Face3 f = faces.get(i / 3); + face_points.set(i, f.vertex[0]); + face_points.set(i + 1, f.vertex[1]); + face_points.set(i + 2, f.vertex[2]); + } + + Ref<ConcavePolygonShape3D> shape = memnew(ConcavePolygonShape3D); + shape->set_faces(face_points); + return shape; +} + +Ref<NavigationMesh> EditorSceneImporterMesh::create_navigation_mesh() { + Vector<Face3> faces = get_faces(); + if (faces.size() == 0) { + return Ref<NavigationMesh>(); + } + + Map<Vector3, int> unique_vertices; + LocalVector<int> face_indices; + + for (int i = 0; i < faces.size(); i++) { + for (int j = 0; j < 3; j++) { + Vector3 v = faces[i].vertex[j]; + int idx; + if (unique_vertices.has(v)) { + idx = unique_vertices[v]; + } else { + idx = unique_vertices.size(); + unique_vertices[v] = idx; + } + face_indices.push_back(idx); + } + } + + Vector<Vector3> vertices; + vertices.resize(unique_vertices.size()); + for (Map<Vector3, int>::Element *E = unique_vertices.front(); E; E = E->next()) { + vertices.write[E->get()] = E->key(); + } + + Ref<NavigationMesh> nm; + nm.instance(); + nm->set_vertices(vertices); + + Vector<int> v3; + v3.resize(3); + for (uint32_t i = 0; i < face_indices.size(); i += 3) { + v3.write[0] = face_indices[i + 0]; + v3.write[1] = face_indices[i + 1]; + v3.write[2] = face_indices[i + 2]; + nm->add_polygon(v3); + } + + return nm; +} + +extern bool (*array_mesh_lightmap_unwrap_callback)(float p_texel_size, const float *p_vertices, const float *p_normals, int p_vertex_count, const int *p_indices, int p_index_count, float **r_uv, int **r_vertex, int *r_vertex_count, int **r_index, int *r_index_count, int *r_size_hint_x, int *r_size_hint_y, int *&r_cache_data, unsigned int &r_cache_size, bool &r_used_cache); + +struct EditorSceneImporterMeshLightmapSurface { + Ref<Material> material; + LocalVector<SurfaceTool::Vertex> vertices; + Mesh::PrimitiveType primitive = Mesh::PrimitiveType::PRIMITIVE_MAX; + uint32_t format = 0; + String name; +}; + +Error EditorSceneImporterMesh::lightmap_unwrap_cached(int *&r_cache_data, unsigned int &r_cache_size, bool &r_used_cache, const Transform &p_base_transform, float p_texel_size) { + ERR_FAIL_COND_V(!array_mesh_lightmap_unwrap_callback, ERR_UNCONFIGURED); + ERR_FAIL_COND_V_MSG(blend_shapes.size() != 0, ERR_UNAVAILABLE, "Can't unwrap mesh with blend shapes."); + + Vector<float> vertices; + Vector<float> normals; + Vector<int> indices; + Vector<float> uv; + Vector<Pair<int, int>> uv_indices; + + Vector<EditorSceneImporterMeshLightmapSurface> lightmap_surfaces; + + // Keep only the scale + Transform transform = p_base_transform; + transform.origin = Vector3(); + transform.looking_at(Vector3(1, 0, 0), Vector3(0, 1, 0)); + + Basis normal_basis = transform.basis.inverse().transposed(); + + for (int i = 0; i < get_surface_count(); i++) { + EditorSceneImporterMeshLightmapSurface s; + s.primitive = get_surface_primitive_type(i); + + ERR_FAIL_COND_V_MSG(s.primitive != Mesh::PRIMITIVE_TRIANGLES, ERR_UNAVAILABLE, "Only triangles are supported for lightmap unwrap."); + Array arrays = get_surface_arrays(i); + s.material = get_surface_material(i); + s.name = get_surface_name(i); + + SurfaceTool::create_vertex_array_from_triangle_arrays(arrays, s.vertices, &s.format); + + Vector<Vector3> rvertices = arrays[Mesh::ARRAY_VERTEX]; + int vc = rvertices.size(); + const Vector3 *r = rvertices.ptr(); + + Vector<Vector3> rnormals = arrays[Mesh::ARRAY_NORMAL]; + + ERR_FAIL_COND_V_MSG(rnormals.size() == 0, ERR_UNAVAILABLE, "Normals are required for lightmap unwrap."); + + const Vector3 *rn = rnormals.ptr(); + + int vertex_ofs = vertices.size() / 3; + + vertices.resize((vertex_ofs + vc) * 3); + normals.resize((vertex_ofs + vc) * 3); + uv_indices.resize(vertex_ofs + vc); + + for (int j = 0; j < vc; j++) { + Vector3 v = transform.xform(r[j]); + Vector3 n = normal_basis.xform(rn[j]).normalized(); + + vertices.write[(j + vertex_ofs) * 3 + 0] = v.x; + vertices.write[(j + vertex_ofs) * 3 + 1] = v.y; + vertices.write[(j + vertex_ofs) * 3 + 2] = v.z; + normals.write[(j + vertex_ofs) * 3 + 0] = n.x; + normals.write[(j + vertex_ofs) * 3 + 1] = n.y; + normals.write[(j + vertex_ofs) * 3 + 2] = n.z; + uv_indices.write[j + vertex_ofs] = Pair<int, int>(i, j); + } + + Vector<int> rindices = arrays[Mesh::ARRAY_INDEX]; + int ic = rindices.size(); + + if (ic == 0) { + for (int j = 0; j < vc / 3; j++) { + if (Face3(r[j * 3 + 0], r[j * 3 + 1], r[j * 3 + 2]).is_degenerate()) { + continue; + } + + indices.push_back(vertex_ofs + j * 3 + 0); + indices.push_back(vertex_ofs + j * 3 + 1); + indices.push_back(vertex_ofs + j * 3 + 2); + } + + } else { + const int *ri = rindices.ptr(); + + for (int j = 0; j < ic / 3; j++) { + if (Face3(r[ri[j * 3 + 0]], r[ri[j * 3 + 1]], r[ri[j * 3 + 2]]).is_degenerate()) { + continue; + } + indices.push_back(vertex_ofs + ri[j * 3 + 0]); + indices.push_back(vertex_ofs + ri[j * 3 + 1]); + indices.push_back(vertex_ofs + ri[j * 3 + 2]); + } + } + + lightmap_surfaces.push_back(s); + } + + //unwrap + + float *gen_uvs; + int *gen_vertices; + int *gen_indices; + int gen_vertex_count; + int gen_index_count; + int size_x; + int size_y; + + bool ok = array_mesh_lightmap_unwrap_callback(p_texel_size, vertices.ptr(), normals.ptr(), vertices.size() / 3, indices.ptr(), indices.size(), &gen_uvs, &gen_vertices, &gen_vertex_count, &gen_indices, &gen_index_count, &size_x, &size_y, r_cache_data, r_cache_size, r_used_cache); + + if (!ok) { + return ERR_CANT_CREATE; + } + + //remove surfaces + clear(); + + //create surfacetools for each surface.. + Vector<Ref<SurfaceTool>> surfaces_tools; + + for (int i = 0; i < lightmap_surfaces.size(); i++) { + Ref<SurfaceTool> st; + st.instance(); + st->begin(Mesh::PRIMITIVE_TRIANGLES); + st->set_material(lightmap_surfaces[i].material); + st->set_meta("name", lightmap_surfaces[i].name); + surfaces_tools.push_back(st); //stay there + } + + print_verbose("Mesh: Gen indices: " + itos(gen_index_count)); + //go through all indices + for (int i = 0; i < gen_index_count; i += 3) { + ERR_FAIL_INDEX_V(gen_vertices[gen_indices[i + 0]], uv_indices.size(), ERR_BUG); + ERR_FAIL_INDEX_V(gen_vertices[gen_indices[i + 1]], uv_indices.size(), ERR_BUG); + ERR_FAIL_INDEX_V(gen_vertices[gen_indices[i + 2]], uv_indices.size(), ERR_BUG); + + ERR_FAIL_COND_V(uv_indices[gen_vertices[gen_indices[i + 0]]].first != uv_indices[gen_vertices[gen_indices[i + 1]]].first || uv_indices[gen_vertices[gen_indices[i + 0]]].first != uv_indices[gen_vertices[gen_indices[i + 2]]].first, ERR_BUG); + + int surface = uv_indices[gen_vertices[gen_indices[i + 0]]].first; + + for (int j = 0; j < 3; j++) { + SurfaceTool::Vertex v = lightmap_surfaces[surface].vertices[uv_indices[gen_vertices[gen_indices[i + j]]].second]; + + if (lightmap_surfaces[surface].format & Mesh::ARRAY_FORMAT_COLOR) { + surfaces_tools.write[surface]->set_color(v.color); + } + if (lightmap_surfaces[surface].format & Mesh::ARRAY_FORMAT_TEX_UV) { + surfaces_tools.write[surface]->set_uv(v.uv); + } + if (lightmap_surfaces[surface].format & Mesh::ARRAY_FORMAT_NORMAL) { + surfaces_tools.write[surface]->set_normal(v.normal); + } + if (lightmap_surfaces[surface].format & Mesh::ARRAY_FORMAT_TANGENT) { + Plane t; + t.normal = v.tangent; + t.d = v.binormal.dot(v.normal.cross(v.tangent)) < 0 ? -1 : 1; + surfaces_tools.write[surface]->set_tangent(t); + } + if (lightmap_surfaces[surface].format & Mesh::ARRAY_FORMAT_BONES) { + surfaces_tools.write[surface]->set_bones(v.bones); + } + if (lightmap_surfaces[surface].format & Mesh::ARRAY_FORMAT_WEIGHTS) { + surfaces_tools.write[surface]->set_weights(v.weights); + } + + Vector2 uv2(gen_uvs[gen_indices[i + j] * 2 + 0], gen_uvs[gen_indices[i + j] * 2 + 1]); + surfaces_tools.write[surface]->set_uv2(uv2); + + surfaces_tools.write[surface]->add_vertex(v.vertex); + } + } + + //generate surfaces + + for (int i = 0; i < surfaces_tools.size(); i++) { + surfaces_tools.write[i]->index(); + Array arrays = surfaces_tools.write[i]->commit_to_arrays(); + add_surface(surfaces_tools.write[i]->get_primitive(), arrays, Array(), Dictionary(), surfaces_tools.write[i]->get_material(), surfaces_tools.write[i]->get_meta("name")); + } + + set_lightmap_size_hint(Size2(size_x, size_y)); + + if (!r_used_cache) { + //free stuff + ::free(gen_vertices); + ::free(gen_indices); + ::free(gen_uvs); + } + + return OK; +} + +void EditorSceneImporterMesh::set_lightmap_size_hint(const Size2i &p_size) { + lightmap_size_hint = p_size; +} + +Size2i EditorSceneImporterMesh::get_lightmap_size_hint() const { + return lightmap_size_hint; +} + void EditorSceneImporterMesh::_bind_methods() { ClassDB::bind_method(D_METHOD("add_blend_shape", "name"), &EditorSceneImporterMesh::add_blend_shape); ClassDB::bind_method(D_METHOD("get_blend_shape_count"), &EditorSceneImporterMesh::get_blend_shape_count); @@ -444,7 +792,7 @@ void EditorSceneImporterMesh::_bind_methods() { ClassDB::bind_method(D_METHOD("set_blend_shape_mode", "mode"), &EditorSceneImporterMesh::set_blend_shape_mode); ClassDB::bind_method(D_METHOD("get_blend_shape_mode"), &EditorSceneImporterMesh::get_blend_shape_mode); - ClassDB::bind_method(D_METHOD("add_surface", "primitive", "arrays", "blend_shapes", "lods", "material"), &EditorSceneImporterMesh::add_surface, DEFVAL(Array()), DEFVAL(Dictionary()), DEFVAL(Ref<Material>()), DEFVAL(String())); + ClassDB::bind_method(D_METHOD("add_surface", "primitive", "arrays", "blend_shapes", "lods", "material", "name"), &EditorSceneImporterMesh::add_surface, DEFVAL(Array()), DEFVAL(Dictionary()), DEFVAL(Ref<Material>()), DEFVAL(String())); ClassDB::bind_method(D_METHOD("get_surface_count"), &EditorSceneImporterMesh::get_surface_count); ClassDB::bind_method(D_METHOD("get_surface_primitive_type", "surface_idx"), &EditorSceneImporterMesh::get_surface_primitive_type); @@ -462,5 +810,8 @@ void EditorSceneImporterMesh::_bind_methods() { ClassDB::bind_method(D_METHOD("_set_data", "data"), &EditorSceneImporterMesh::_set_data); ClassDB::bind_method(D_METHOD("_get_data"), &EditorSceneImporterMesh::_get_data); + ClassDB::bind_method(D_METHOD("set_lightmap_size_hint", "size"), &EditorSceneImporterMesh::set_lightmap_size_hint); + ClassDB::bind_method(D_METHOD("get_lightmap_size_hint"), &EditorSceneImporterMesh::get_lightmap_size_hint); + ADD_PROPERTY(PropertyInfo(Variant::DICTIONARY, "_data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "_set_data", "_get_data"); } diff --git a/editor/import/scene_importer_mesh.h b/editor/import/scene_importer_mesh.h index 42507cbe8c..3326fab55d 100644 --- a/editor/import/scene_importer_mesh.h +++ b/editor/import/scene_importer_mesh.h @@ -32,7 +32,10 @@ #define EDITOR_SCENE_IMPORTER_MESH_H #include "core/io/resource.h" +#include "scene/resources/concave_polygon_shape_3d.h" +#include "scene/resources/convex_polygon_shape_3d.h" #include "scene/resources/mesh.h" +#include "scene/resources/navigation_mesh.h" // The following classes are used by importers instead of ArrayMesh and MeshInstance3D // so the data is not registered (hence, quality loss), importing happens faster and // its easier to modify before saving @@ -63,6 +66,8 @@ class EditorSceneImporterMesh : public Resource { Ref<EditorSceneImporterMesh> shadow_mesh; + Size2i lightmap_size_hint; + protected: void _set_data(const Dictionary &p_data); Dictionary _get_data() const; @@ -89,13 +94,24 @@ public: float get_surface_lod_size(int p_surface, int p_lod) const; Ref<Material> get_surface_material(int p_surface) const; + void set_surface_material(int p_surface, const Ref<Material> &p_material); + void generate_lods(); void create_shadow_mesh(); Ref<EditorSceneImporterMesh> get_shadow_mesh() const; + Vector<Face3> get_faces() const; + Vector<Ref<Shape3D>> convex_decompose() const; + Ref<Shape3D> create_trimesh_shape() const; + Ref<NavigationMesh> create_navigation_mesh(); + Error lightmap_unwrap_cached(int *&r_cache_data, unsigned int &r_cache_size, bool &r_used_cache, const Transform &p_base_transform, float p_texel_size); + + void set_lightmap_size_hint(const Size2i &p_size); + Size2i get_lightmap_size_hint() const; + bool has_mesh() const; - Ref<ArrayMesh> get_mesh(); + Ref<ArrayMesh> get_mesh(const Ref<Mesh> &p_base = Ref<Mesh>()); void clear(); }; #endif // EDITOR_SCENE_IMPORTER_MESH_H diff --git a/editor/import_defaults_editor.cpp b/editor/import_defaults_editor.cpp new file mode 100644 index 0000000000..43b97eb910 --- /dev/null +++ b/editor/import_defaults_editor.cpp @@ -0,0 +1,216 @@ +/*************************************************************************/ +/* import_defaults_editor.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2021 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 "import_defaults_editor.h" + +class ImportDefaultsEditorSettings : public Object { + GDCLASS(ImportDefaultsEditorSettings, Object) + friend class ImportDefaultsEditor; + List<PropertyInfo> properties; + Map<StringName, Variant> values; + Map<StringName, Variant> default_values; + + Ref<ResourceImporter> importer; + +protected: + bool _set(const StringName &p_name, const Variant &p_value) { + if (values.has(p_name)) { + values[p_name] = p_value; + return true; + } else { + return false; + } + } + bool _get(const StringName &p_name, Variant &r_ret) const { + if (values.has(p_name)) { + r_ret = values[p_name]; + return true; + } else { + r_ret = Variant(); + return false; + } + } + void _get_property_list(List<PropertyInfo> *p_list) const { + if (importer.is_null()) { + return; + } + for (const List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) { + if (importer->get_option_visibility(E->get().name, values)) { + p_list->push_back(E->get()); + } + } + } +}; + +void ImportDefaultsEditor::_notification(int p_what) { + if (p_what == NOTIFICATION_PREDELETE) { + inspector->edit(nullptr); + } +} + +void ImportDefaultsEditor::_reset() { + if (settings->importer.is_valid()) { + settings->values = settings->default_values; + settings->notify_property_list_changed(); + } +} + +void ImportDefaultsEditor::_save() { + if (settings->importer.is_valid()) { + Dictionary modified; + + for (Map<StringName, Variant>::Element *E = settings->values.front(); E; E = E->next()) { + if (E->get() != settings->default_values[E->key()]) { + modified[E->key()] = E->get(); + } + } + + if (modified.size()) { + ProjectSettings::get_singleton()->set("importer_defaults/" + settings->importer->get_importer_name(), modified); + } else { + ProjectSettings::get_singleton()->set("importer_defaults/" + settings->importer->get_importer_name(), Variant()); + } + + emit_signal("project_settings_changed"); + } +} + +void ImportDefaultsEditor::_update_importer() { + List<Ref<ResourceImporter>> importer_list; + ResourceFormatImporter::get_singleton()->get_importers(&importer_list); + Ref<ResourceImporter> importer; + for (List<Ref<ResourceImporter>>::Element *E = importer_list.front(); E; E = E->next()) { + if (E->get()->get_visible_name() == importers->get_item_text(importers->get_selected())) { + importer = E->get(); + break; + } + } + + settings->properties.clear(); + settings->values.clear(); + settings->importer = importer; + + if (importer.is_valid()) { + List<ResourceImporter::ImportOption> options; + importer->get_import_options(&options); + Dictionary d; + if (ProjectSettings::get_singleton()->has_setting("importer_defaults/" + importer->get_importer_name())) { + d = ProjectSettings::get_singleton()->get("importer_defaults/" + importer->get_importer_name()); + } + + for (List<ResourceImporter::ImportOption>::Element *E = options.front(); E; E = E->next()) { + settings->properties.push_back(E->get().option); + if (d.has(E->get().option.name)) { + settings->values[E->get().option.name] = d[E->get().option.name]; + } else { + settings->values[E->get().option.name] = E->get().default_value; + } + settings->default_values[E->get().option.name] = E->get().default_value; + } + + save_defaults->set_disabled(false); + reset_defaults->set_disabled(false); + + } else { + save_defaults->set_disabled(true); + reset_defaults->set_disabled(true); + } + + settings->notify_property_list_changed(); + + inspector->edit(settings); +} + +void ImportDefaultsEditor::_importer_selected(int p_index) { + _update_importer(); +} + +void ImportDefaultsEditor::clear() { + String last_selected; + if (importers->get_selected() > 0) { + last_selected = importers->get_item_text(importers->get_selected()); + } + + importers->clear(); + + importers->add_item("<" + TTR("Select Importer") + ">"); + importers->set_item_disabled(0, true); + + List<Ref<ResourceImporter>> importer_list; + ResourceFormatImporter::get_singleton()->get_importers(&importer_list); + Vector<String> names; + for (List<Ref<ResourceImporter>>::Element *E = importer_list.front(); E; E = E->next()) { + String vn = E->get()->get_visible_name(); + names.push_back(vn); + } + names.sort(); + + for (int i = 0; i < names.size(); i++) { + importers->add_item(names[i]); + + if (names[i] == last_selected) { + importers->select(i + 1); + } + } +} + +void ImportDefaultsEditor::_bind_methods() { + ADD_SIGNAL(MethodInfo("project_settings_changed")); +} + +ImportDefaultsEditor::ImportDefaultsEditor() { + HBoxContainer *hb = memnew(HBoxContainer); + hb->add_child(memnew(Label(TTR("Importer:")))); + importers = memnew(OptionButton); + hb->add_child(importers); + hb->add_spacer(); + importers->connect("item_selected", callable_mp(this, &ImportDefaultsEditor::_importer_selected)); + reset_defaults = memnew(Button); + reset_defaults->set_text(TTR("Reset to Defaults")); + reset_defaults->set_disabled(true); + reset_defaults->connect("pressed", callable_mp(this, &ImportDefaultsEditor::_reset)); + hb->add_child(reset_defaults); + add_child(hb); + inspector = memnew(EditorInspector); + add_child(inspector); + inspector->set_v_size_flags(SIZE_EXPAND_FILL); + CenterContainer *cc = memnew(CenterContainer); + save_defaults = memnew(Button); + save_defaults->set_text(TTR("Save")); + save_defaults->connect("pressed", callable_mp(this, &ImportDefaultsEditor::_save)); + cc->add_child(save_defaults); + add_child(cc); + + settings = memnew(ImportDefaultsEditorSettings); +} + +ImportDefaultsEditor::~ImportDefaultsEditor() { + memdelete(settings); +} diff --git a/editor/editor_sub_scene.h b/editor/import_defaults_editor.h index 428bd5a40e..c1becac5e9 100644 --- a/editor/editor_sub_scene.h +++ b/editor/import_defaults_editor.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* editor_sub_scene.h */ +/* import_defaults_editor.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,44 +28,48 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef EDITOR_SUB_SCENE_H -#define EDITOR_SUB_SCENE_H +#ifndef IMPORT_DEFAULTS_EDITOR_H +#define IMPORT_DEFAULTS_EDITOR_H -#include "editor/editor_file_dialog.h" -#include "scene/gui/dialogs.h" -#include "scene/gui/tree.h" +#include "core/object/undo_redo.h" +#include "editor/action_map_editor.h" +#include "editor/editor_data.h" +#include "editor/editor_plugin_settings.h" +#include "editor/editor_sectioned_inspector.h" +#include "editor/localization_editor.h" +#include "editor/shader_globals_editor.h" +#include "editor_autoload_settings.h" +#include "scene/gui/center_container.h" +#include "scene/gui/option_button.h" -class EditorSubScene : public ConfirmationDialog { - GDCLASS(EditorSubScene, ConfirmationDialog); +class ImportDefaultsEditorSettings; - List<Node *> selection; - LineEdit *path; - Tree *tree; - Node *scene; - bool is_root; +class ImportDefaultsEditor : public VBoxContainer { + GDCLASS(ImportDefaultsEditor, VBoxContainer) - EditorFileDialog *file_dialog; + OptionButton *importers; + Button *save_defaults; + Button *reset_defaults; - void _fill_tree(Node *p_node, TreeItem *p_parent); - void _selected_changed(); - void _item_multi_selected(Object *p_object, int p_cell, bool p_selected); - void _item_activated(); - void _remove_selection_child(Node *p_node); - void _reown(Node *p_node, List<Node *> *p_to_reown); + EditorInspector *inspector; - void ok_pressed() override; + ImportDefaultsEditorSettings *settings; + + void _update_importer(); + void _importer_selected(int p_index); + + void _reset(); + void _save(); protected: void _notification(int p_what); static void _bind_methods(); - void _path_browse(); - void _path_selected(const String &p_path); - void _path_changed(const String &p_path); public: - void move(Node *p_new_parent, Node *p_new_owner); void clear(); - EditorSubScene(); + + ImportDefaultsEditor(); + ~ImportDefaultsEditor(); }; -#endif // EDITOR_SUB_SCENE_H +#endif // IMPORT_DEFAULTS_EDITOR_H diff --git a/editor/import_dock.cpp b/editor/import_dock.cpp index 103e5e81cb..ddc363113c 100644 --- a/editor/import_dock.cpp +++ b/editor/import_dock.cpp @@ -48,7 +48,7 @@ public: values[p_name] = p_value; if (checking) { checked.insert(p_name); - _change_notify(); + notify_property_list_changed(); } return true; } @@ -81,7 +81,7 @@ public: } void update() { - _change_notify(); + notify_property_list_changed(); } ImportDockParameters() { @@ -98,11 +98,9 @@ void ImportDock::set_edit_path(const String &p_path) { return; } - params->importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(config->get_value("remap", "importer")); - if (params->importer.is_null()) { - clear(); - return; - } + String importer_name = config->get_value("remap", "importer"); + + params->importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(importer_name); params->paths.clear(); params->paths.push_back(p_path); @@ -124,11 +122,18 @@ void ImportDock::set_edit_path(const String &p_path) { for (List<Pair<String, String>>::Element *E = importer_names.front(); E; E = E->next()) { import_as->add_item(E->get().first); import_as->set_item_metadata(import_as->get_item_count() - 1, E->get().second); - if (E->get().second == params->importer->get_importer_name()) { + if (E->get().second == importer_name) { import_as->select(import_as->get_item_count() - 1); } } + import_as->add_separator(); + import_as->add_item(TTR("Keep File (No Import)")); + import_as->set_item_metadata(import_as->get_item_count() - 1, "keep"); + if (importer_name == "keep") { + import_as->select(import_as->get_item_count() - 1); + } + import->set_disabled(false); import_as->set_disabled(false); preset->set_disabled(false); @@ -138,7 +143,10 @@ void ImportDock::set_edit_path(const String &p_path) { void ImportDock::_update_options(const Ref<ConfigFile> &p_config) { List<ResourceImporter::ImportOption> options; - params->importer->get_import_options(&options); + + if (params->importer.is_valid()) { + params->importer->get_import_options(&options); + } params->properties.clear(); params->values.clear(); @@ -156,6 +164,14 @@ void ImportDock::_update_options(const Ref<ConfigFile> &p_config) { params->update(); _update_preset_menu(); + + if (params->importer.is_valid() && params->paths.size() == 1 && params->importer->has_advanced_options()) { + advanced->show(); + advanced_spacer->show(); + } else { + advanced->hide(); + advanced_spacer->hide(); + } } void ImportDock::set_edit_multiple_paths(const Vector<String> &p_paths) { @@ -258,11 +274,26 @@ void ImportDock::set_edit_multiple_paths(const Vector<String> &p_paths) { preset->set_disabled(false); imported->set_text(vformat(TTR("%d Files"), p_paths.size())); + + if (params->paths.size() == 1 && params->importer->has_advanced_options()) { + advanced->show(); + advanced_spacer->show(); + } else { + advanced->hide(); + advanced_spacer->hide(); + } } void ImportDock::_update_preset_menu() { preset->get_popup()->clear(); + if (params->importer.is_null()) { + preset->get_popup()->add_item(TTR("Default")); + preset->hide(); + return; + } + preset->show(); + if (params->importer->get_preset_count() == 0) { preset->get_popup()->add_item(TTR("Default")); } else { @@ -282,20 +313,25 @@ void ImportDock::_update_preset_menu() { void ImportDock::_importer_selected(int i_idx) { String name = import_as->get_selected_metadata(); - Ref<ResourceImporter> importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(name); - ERR_FAIL_COND(importer.is_null()); + if (name == "keep") { + params->importer.unref(); + _update_options(Ref<ConfigFile>()); + } else { + Ref<ResourceImporter> importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(name); + ERR_FAIL_COND(importer.is_null()); - params->importer = importer; + params->importer = importer; - Ref<ConfigFile> config; - if (params->paths.size()) { - config.instance(); - Error err = config->load(params->paths[0] + ".import"); - if (err != OK) { - config.unref(); + Ref<ConfigFile> config; + if (params->paths.size()) { + config.instance(); + Error err = config->load(params->paths[0] + ".import"); + if (err != OK) { + config.unref(); + } } + _update_options(config); } - _update_options(config); } void ImportDock::_preset_selected(int p_idx) { @@ -391,6 +427,13 @@ static bool _find_owners(EditorFileSystemDirectory *efsd, const String &p_path) void ImportDock::_reimport_attempt() { bool need_restart = false; bool used_in_resources = false; + + String importer_name; + if (params->importer.is_valid()) { + importer_name = params->importer->get_importer_name(); + } else { + importer_name = "keep"; + } for (int i = 0; i < params->paths.size(); i++) { Ref<ConfigFile> config; config.instance(); @@ -398,7 +441,7 @@ void ImportDock::_reimport_attempt() { ERR_CONTINUE(err != OK); String imported_with = config->get_value("remap", "importer"); - if (imported_with != params->importer->get_importer_name()) { + if (imported_with != importer_name) { need_restart = true; if (_find_owners(EditorFileSystem::get_singleton()->get_filesystem(), params->paths[i])) { used_in_resources = true; @@ -422,6 +465,11 @@ void ImportDock::_reimport_and_restart() { EditorNode::get_singleton()->restart_editor(); } +void ImportDock::_advanced_options() { + if (params->paths.size() == 1 && params->importer.is_valid()) { + params->importer->show_advanced_options(params->paths[0]); + } +} void ImportDock::_reimport() { for (int i = 0; i < params->paths.size(); i++) { Ref<ConfigFile> config; @@ -429,38 +477,45 @@ void ImportDock::_reimport() { Error err = config->load(params->paths[i] + ".import"); ERR_CONTINUE(err != OK); - String importer_name = params->importer->get_importer_name(); + if (params->importer.is_valid()) { + String importer_name = params->importer->get_importer_name(); + + if (params->checking && config->get_value("remap", "importer") == params->importer->get_importer_name()) { + //update only what is edited (checkboxes) if the importer is the same + for (List<PropertyInfo>::Element *E = params->properties.front(); E; E = E->next()) { + if (params->checked.has(E->get().name)) { + config->set_value("params", E->get().name, params->values[E->get().name]); + } + } + } else { + //override entirely + config->set_value("remap", "importer", importer_name); + if (config->has_section("params")) { + config->erase_section("params"); + } - if (params->checking && config->get_value("remap", "importer") == params->importer->get_importer_name()) { - //update only what is edited (checkboxes) if the importer is the same - for (List<PropertyInfo>::Element *E = params->properties.front(); E; E = E->next()) { - if (params->checked.has(E->get().name)) { + for (List<PropertyInfo>::Element *E = params->properties.front(); E; E = E->next()) { config->set_value("params", E->get().name, params->values[E->get().name]); } } - } else { - //override entirely - config->set_value("remap", "importer", importer_name); - if (config->has_section("params")) { - config->erase_section("params"); - } - for (List<PropertyInfo>::Element *E = params->properties.front(); E; E = E->next()) { - config->set_value("params", E->get().name, params->values[E->get().name]); + //handle group file + Ref<ResourceImporter> importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(importer_name); + ERR_CONTINUE(!importer.is_valid()); + String group_file_property = importer->get_option_group_file(); + if (group_file_property != String()) { + //can import from a group (as in, atlas) + ERR_CONTINUE(!params->values.has(group_file_property)); + String group_file = params->values[group_file_property]; + config->set_value("remap", "group_file", group_file); + } else { + config->set_value("remap", "group_file", Variant()); //clear group file if unused } - } - //handle group file - Ref<ResourceImporter> importer = ResourceFormatImporter::get_singleton()->get_importer_by_name(importer_name); - ERR_CONTINUE(!importer.is_valid()); - String group_file_property = importer->get_option_group_file(); - if (group_file_property != String()) { - //can import from a group (as in, atlas) - ERR_CONTINUE(!params->values.has(group_file_property)); - String group_file = params->values[group_file_property]; - config->set_value("remap", "group_file", group_file); } else { - config->set_value("remap", "group_file", Variant()); //clear group file if unused + //set to no import + config->clear(); + config->set_value("remap", "importer", "keep"); } config->save(params->paths[i] + ".import"); @@ -531,10 +586,27 @@ ImportDock::ImportDock() { import->set_text(TTR("Reimport")); import->set_disabled(true); import->connect("pressed", callable_mp(this, &ImportDock::_reimport_attempt)); + if (!DisplayServer::get_singleton()->get_swap_cancel_ok()) { + advanced_spacer = hb->add_spacer(); + advanced = memnew(Button); + advanced->set_text(TTR("Advanced...")); + hb->add_child(advanced); + } hb->add_spacer(); hb->add_child(import); hb->add_spacer(); + if (DisplayServer::get_singleton()->get_swap_cancel_ok()) { + advanced = memnew(Button); + advanced->set_text(TTR("Advanced...")); + hb->add_child(advanced); + advanced_spacer = hb->add_spacer(); + } + + advanced->hide(); + advanced_spacer->hide(); + advanced->connect("pressed", callable_mp(this, &ImportDock::_advanced_options)); + reimport_confirm = memnew(ConfirmationDialog); reimport_confirm->get_ok_button()->set_text(TTR("Save Scenes, Re-Import, and Restart")); add_child(reimport_confirm); diff --git a/editor/import_dock.h b/editor/import_dock.h index 6c5779ddce..2be48dd505 100644 --- a/editor/import_dock.h +++ b/editor/import_dock.h @@ -57,6 +57,9 @@ class ImportDock : public VBoxContainer { Label *label_warning; Button *import; + Control *advanced_spacer; + Button *advanced; + ImportDockParameters *params; void _preset_selected(int p_idx); @@ -69,6 +72,7 @@ class ImportDock : public VBoxContainer { void _reimport_and_restart(); void _reimport(); + void _advanced_options(); enum { ITEM_SET_AS_DEFAULT = 100, ITEM_LOAD_DEFAULT, diff --git a/editor/input_map_editor.cpp b/editor/input_map_editor.cpp deleted file mode 100644 index 9a5e7d164c..0000000000 --- a/editor/input_map_editor.cpp +++ /dev/null @@ -1,1033 +0,0 @@ -/*************************************************************************/ -/* input_map_editor.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2021 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 "input_map_editor.h" - -#include "core/input/input_map.h" -#include "core/os/keyboard.h" -#include "editor/editor_node.h" -#include "editor/editor_scale.h" - -void InputMapEditor::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - action_add_error->add_theme_color_override("font_color", input_editor->get_theme_color("error_color", "Editor")); - popup_add->add_icon_item(input_editor->get_theme_icon("Keyboard", "EditorIcons"), TTR("Key"), INPUT_KEY); - popup_add->add_icon_item(input_editor->get_theme_icon("KeyboardPhysical", "EditorIcons"), TTR("Physical Key"), INPUT_KEY_PHYSICAL); - popup_add->add_icon_item(input_editor->get_theme_icon("JoyButton", "EditorIcons"), TTR("Joy Button"), INPUT_JOY_BUTTON); - popup_add->add_icon_item(input_editor->get_theme_icon("JoyAxis", "EditorIcons"), TTR("Joy Axis"), INPUT_JOY_MOTION); - popup_add->add_icon_item(input_editor->get_theme_icon("Mouse", "EditorIcons"), TTR("Mouse Button"), INPUT_MOUSE_BUTTON); - _update_actions(); - } break; - case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { - action_add_error->add_theme_color_override("font_color", input_editor->get_theme_color("error_color", "Editor")); - popup_add->set_item_icon(popup_add->get_item_index(INPUT_KEY), input_editor->get_theme_icon("Keyboard", "EditorIcons")); - popup_add->set_item_icon(popup_add->get_item_index(INPUT_KEY_PHYSICAL), input_editor->get_theme_icon("KeyboardPhysical", "EditorIcons")); - popup_add->set_item_icon(popup_add->get_item_index(INPUT_JOY_BUTTON), input_editor->get_theme_icon("JoyButton", "EditorIcons")); - popup_add->set_item_icon(popup_add->get_item_index(INPUT_JOY_MOTION), input_editor->get_theme_icon("JoyAxis", "EditorIcons")); - popup_add->set_item_icon(popup_add->get_item_index(INPUT_MOUSE_BUTTON), input_editor->get_theme_icon("Mouse", "EditorIcons")); - _update_actions(); - } break; - } -} - -static bool _validate_action_name(const String &p_name) { - const char32_t *cstr = p_name.get_data(); - for (int i = 0; cstr[i]; i++) { - if (cstr[i] == '/' || cstr[i] == ':' || cstr[i] == '"' || - cstr[i] == '=' || cstr[i] == '\\' || cstr[i] < 32) { - return false; - } - } - return true; -} - -void InputMapEditor::_action_selected() { - TreeItem *ti = input_editor->get_selected(); - if (!ti || !ti->is_editable(0)) { - return; - } - - add_at = "input/" + ti->get_text(0); - edit_idx = -1; -} - -void InputMapEditor::_action_edited() { - TreeItem *ti = input_editor->get_selected(); - if (!ti) { - return; - } - - if (input_editor->get_selected_column() == 0) { - String new_name = ti->get_text(0); - String old_name = add_at.substr(add_at.find("/") + 1, add_at.length()); - - if (new_name == old_name) { - return; - } - - if (new_name == "" || !_validate_action_name(new_name)) { - ti->set_text(0, old_name); - add_at = "input/" + old_name; - - message->set_text(TTR("Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or '\"'")); - message->popup_centered(Size2(300, 100) * EDSCALE); - return; - } - - String action_prop = "input/" + new_name; - - if (ProjectSettings::get_singleton()->has_setting(action_prop)) { - ti->set_text(0, old_name); - add_at = "input/" + old_name; - - message->set_text(vformat(TTR("An action with the name '%s' already exists."), new_name)); - message->popup_centered(Size2(300, 100) * EDSCALE); - return; - } - - int order = ProjectSettings::get_singleton()->get_order(add_at); - Dictionary action = ProjectSettings::get_singleton()->get(add_at); - - setting = true; - undo_redo->create_action(TTR("Rename Input Action Event")); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "clear", add_at); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", action_prop, action); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set_order", action_prop, order); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "clear", action_prop); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", add_at, action); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", add_at, order); - undo_redo->add_do_method(this, "_update_actions"); - undo_redo->add_undo_method(this, "_update_actions"); - undo_redo->add_do_method(this, "emit_signal", inputmap_changed); - undo_redo->add_undo_method(this, "emit_signal", inputmap_changed); - undo_redo->commit_action(); - setting = false; - - add_at = action_prop; - } else if (input_editor->get_selected_column() == 1) { - String name = "input/" + ti->get_text(0); - Dictionary old_action = ProjectSettings::get_singleton()->get(name); - Dictionary new_action = old_action.duplicate(); - new_action["deadzone"] = ti->get_range(1); - - undo_redo->create_action(TTR("Change Action deadzone")); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, new_action); - undo_redo->add_do_method(this, "emit_signal", inputmap_changed); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, old_action); - undo_redo->add_undo_method(this, "emit_signal", inputmap_changed); - undo_redo->commit_action(); - } -} - -void InputMapEditor::_device_input_add() { - Ref<InputEvent> ie; - String name = add_at; - int idx = edit_idx; - Dictionary old_val = ProjectSettings::get_singleton()->get(name); - Dictionary action = old_val.duplicate(); - Array events = action["events"]; - - switch (add_type) { - case INPUT_MOUSE_BUTTON: { - Ref<InputEventMouseButton> mb; - mb.instance(); - mb->set_button_index(device_index->get_selected() + 1); - mb->set_device(_get_current_device()); - - for (int i = 0; i < events.size(); i++) { - Ref<InputEventMouseButton> aie = events[i]; - if (aie.is_null()) { - continue; - } - if (aie->get_device() == mb->get_device() && aie->get_button_index() == mb->get_button_index()) { - return; - } - } - - ie = mb; - - } break; - case INPUT_JOY_MOTION: { - Ref<InputEventJoypadMotion> jm; - jm.instance(); - jm->set_axis(device_index->get_selected() >> 1); - jm->set_axis_value((device_index->get_selected() & 1) ? 1 : -1); - jm->set_device(_get_current_device()); - - for (int i = 0; i < events.size(); i++) { - Ref<InputEventJoypadMotion> aie = events[i]; - if (aie.is_null()) { - continue; - } - - if (aie->get_device() == jm->get_device() && aie->get_axis() == jm->get_axis() && aie->get_axis_value() == jm->get_axis_value()) { - return; - } - } - - ie = jm; - - } break; - case INPUT_JOY_BUTTON: { - Ref<InputEventJoypadButton> jb; - jb.instance(); - - jb->set_button_index(device_index->get_selected()); - jb->set_device(_get_current_device()); - - for (int i = 0; i < events.size(); i++) { - Ref<InputEventJoypadButton> aie = events[i]; - if (aie.is_null()) { - continue; - } - if (aie->get_device() == jb->get_device() && aie->get_button_index() == jb->get_button_index()) { - return; - } - } - ie = jb; - - } break; - default: { - } - } - - if (idx < 0 || idx >= events.size()) { - events.push_back(ie); - } else { - events[idx] = ie; - } - action["events"] = events; - - undo_redo->create_action(TTR("Add Input Action Event")); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, action); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, old_val); - undo_redo->add_do_method(this, "_update_actions"); - undo_redo->add_undo_method(this, "_update_actions"); - undo_redo->add_do_method(this, "emit_signal", inputmap_changed); - undo_redo->add_undo_method(this, "emit_signal", inputmap_changed); - undo_redo->commit_action(); - - _show_last_added(ie, name); -} - -void InputMapEditor::_set_current_device(int i_device) { - device_id->select(i_device + 1); -} - -int InputMapEditor::_get_current_device() { - return device_id->get_selected() - 1; -} - -String InputMapEditor::_get_device_string(int i_device) { - if (i_device == InputMap::ALL_DEVICES) { - return TTR("All Devices"); - } - return TTR("Device") + " " + itos(i_device); -} - -void InputMapEditor::_press_a_key_confirm() { - if (last_wait_for_key.is_null()) { - return; - } - - Ref<InputEventKey> ie; - ie.instance(); - if (press_a_key_physical) { - ie->set_physical_keycode(last_wait_for_key->get_physical_keycode()); - ie->set_keycode(0); - } else { - ie->set_physical_keycode(0); - ie->set_keycode(last_wait_for_key->get_keycode()); - } - ie->set_shift(last_wait_for_key->get_shift()); - ie->set_alt(last_wait_for_key->get_alt()); - ie->set_control(last_wait_for_key->get_control()); - ie->set_metakey(last_wait_for_key->get_metakey()); - - String name = add_at; - int idx = edit_idx; - - Dictionary old_val = ProjectSettings::get_singleton()->get(name); - Dictionary action = old_val.duplicate(); - Array events = action["events"]; - - for (int i = 0; i < events.size(); i++) { - Ref<InputEventKey> aie = events[i]; - if (aie.is_null()) { - continue; - } - if (!press_a_key_physical) { - if (aie->get_keycode_with_modifiers() == ie->get_keycode_with_modifiers()) { - return; - } - } else { - if (aie->get_physical_keycode_with_modifiers() == ie->get_physical_keycode_with_modifiers()) { - return; - } - } - } - - if (idx < 0 || idx >= events.size()) { - events.push_back(ie); - } else { - events[idx] = ie; - } - action["events"] = events; - - undo_redo->create_action(TTR("Add Input Action Event")); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, action); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, old_val); - undo_redo->add_do_method(this, "_update_actions"); - undo_redo->add_undo_method(this, "_update_actions"); - undo_redo->add_do_method(this, "emit_signal", inputmap_changed); - undo_redo->add_undo_method(this, "emit_signal", inputmap_changed); - undo_redo->commit_action(); - - _show_last_added(ie, name); -} - -void InputMapEditor::_show_last_added(const Ref<InputEvent> &p_event, const String &p_name) { - TreeItem *r = input_editor->get_root(); - - String name = p_name; - name.erase(0, 6); - if (!r) { - return; - } - r = r->get_children(); - if (!r) { - return; - } - bool found = false; - while (r) { - if (r->get_text(0) != name) { - r = r->get_next(); - continue; - } - TreeItem *child = r->get_children(); - while (child) { - Variant input = child->get_meta("__input"); - if (p_event == input) { - r->set_collapsed(false); - child->select(0); - found = true; - break; - } - child = child->get_next(); - } - if (found) { - break; - } - r = r->get_next(); - } - - if (found) { - input_editor->ensure_cursor_is_visible(); - } -} - -// Maps to 2*axis if value is neg, or + 1 if value is pos. -static const char *_joy_axis_descriptions[JOY_AXIS_MAX * 2] = { - TTRC("Left Stick Left, Joystick 0 Left"), - TTRC("Left Stick Right, Joystick 0 Right"), - TTRC("Left Stick Up, Joystick 0 Up"), - TTRC("Left Stick Down, Joystick 0 Down"), - TTRC("Right Stick Left, Joystick 1 Left"), - TTRC("Right Stick Right, Joystick 1 Right"), - TTRC("Right Stick Up, Joystick 1 Up"), - TTRC("Right Stick Down, Joystick 1 Down"), - TTRC("Joystick 2 Left"), - TTRC("Left Trigger, Sony L2, Xbox LT, Joystick 2 Right"), - TTRC("Joystick 2 Up"), - TTRC("Right Trigger, Sony R2, Xbox RT, Joystick 2 Down"), - TTRC("Joystick 3 Left"), - TTRC("Joystick 3 Right"), - TTRC("Joystick 3 Up"), - TTRC("Joystick 3 Down"), - TTRC("Joystick 4 Left"), - TTRC("Joystick 4 Right"), - TTRC("Joystick 4 Up"), - TTRC("Joystick 4 Down"), -}; - -// Separate from `InputEvent::as_text()` since the descriptions need to be different for the input map editor. See #43660. -String InputMapEditor::_get_joypad_motion_event_text(const Ref<InputEventJoypadMotion> &p_event) { - ERR_FAIL_COND_V_MSG(p_event.is_null(), String(), "Provided event is not a valid instance of InputEventJoypadMotion"); - - String desc = TTR("Unknown Joypad Axis"); - if (p_event->get_axis() < JOY_AXIS_MAX) { - desc = RTR(_joy_axis_descriptions[2 * p_event->get_axis() + (p_event->get_axis_value() < 0 ? 0 : 1)]); - } - - return vformat("Joypad Axis %s %s (%s)", itos(p_event->get_axis()), p_event->get_axis_value() < 0 ? "-" : "+", desc); -} - -void InputMapEditor::_wait_for_key(const Ref<InputEvent> &p_event) { - Ref<InputEventKey> k = p_event; - - if (k.is_valid() && k->is_pressed() && k->get_keycode() != 0) { - last_wait_for_key = p_event; - const String str = (press_a_key_physical) ? keycode_get_string(k->get_physical_keycode_with_modifiers()) + TTR(" (Physical)") : keycode_get_string(k->get_keycode_with_modifiers()); - - press_a_key_label->set_text(str); - press_a_key->get_ok_button()->set_disabled(false); - press_a_key->set_input_as_handled(); - } -} - -void InputMapEditor::_edit_item(Ref<InputEvent> p_exiting_event) { - InputType ie_type; - - if ((Ref<InputEventKey>(p_exiting_event)).is_valid()) { - if ((Ref<InputEventKey>(p_exiting_event))->get_keycode() != 0) { - ie_type = INPUT_KEY; - } else { - ie_type = INPUT_KEY_PHYSICAL; - } - } else if ((Ref<InputEventJoypadButton>(p_exiting_event)).is_valid()) { - ie_type = INPUT_JOY_BUTTON; - } else if ((Ref<InputEventMouseButton>(p_exiting_event)).is_valid()) { - ie_type = INPUT_MOUSE_BUTTON; - } else if ((Ref<InputEventJoypadMotion>(p_exiting_event)).is_valid()) { - ie_type = INPUT_JOY_MOTION; - } else { - return; - } - - _add_item(ie_type, p_exiting_event); -} - -void InputMapEditor::_add_item(int p_item, Ref<InputEvent> p_exiting_event) { - add_type = InputType(p_item); - - switch (add_type) { - case INPUT_KEY: { - press_a_key_physical = false; - press_a_key_label->set_text(TTR("Press a Key...")); - press_a_key->get_ok_button()->set_disabled(true); - last_wait_for_key = Ref<InputEvent>(); - press_a_key->popup_centered(Size2(250, 80) * EDSCALE); - //press_a_key->grab_focus(); - - } break; - case INPUT_KEY_PHYSICAL: { - press_a_key_physical = true; - press_a_key_label->set_text(TTR("Press a Key...")); - - last_wait_for_key = Ref<InputEvent>(); - press_a_key->popup_centered(Size2(250, 80) * EDSCALE); - press_a_key->grab_focus(); - - } break; - case INPUT_MOUSE_BUTTON: { - device_index_label->set_text(TTR("Mouse Button Index:")); - device_index->clear(); - device_index->add_item(TTR("Left Button")); - device_index->add_item(TTR("Right Button")); - device_index->add_item(TTR("Middle Button")); - device_index->add_item(TTR("Wheel Up Button")); - device_index->add_item(TTR("Wheel Down Button")); - device_index->add_item(TTR("Wheel Left Button")); - device_index->add_item(TTR("Wheel Right Button")); - device_index->add_item(TTR("X Button 1")); - device_index->add_item(TTR("X Button 2")); - device_input->popup_centered(Size2(350, 95) * EDSCALE); - - Ref<InputEventMouseButton> mb = p_exiting_event; - if (mb.is_valid()) { - device_index->select(mb->get_button_index() - 1); - _set_current_device(mb->get_device()); - device_input->get_ok_button()->set_text(TTR("Change")); - } else { - _set_current_device(0); - device_input->get_ok_button()->set_text(TTR("Add")); - } - - } break; - case INPUT_JOY_MOTION: { - device_index_label->set_text(TTR("Joypad Axis Index:")); - device_index->clear(); - for (int i = 0; i < JOY_AXIS_MAX * 2; i++) { - Ref<InputEventJoypadMotion> jm; - jm.instance(); - jm->set_axis(i / 2); - jm->set_axis_value((i & 1) ? 1 : -1); - device_index->add_item(_get_joypad_motion_event_text(jm)); - } - device_input->popup_centered(Size2(350, 95) * EDSCALE); - - Ref<InputEventJoypadMotion> jm = p_exiting_event; - if (jm.is_valid()) { - device_index->select(jm->get_axis() * 2 + (jm->get_axis_value() > 0 ? 1 : 0)); - _set_current_device(jm->get_device()); - device_input->get_ok_button()->set_text(TTR("Change")); - } else { - _set_current_device(0); - device_input->get_ok_button()->set_text(TTR("Add")); - } - - } break; - case INPUT_JOY_BUTTON: { - device_index_label->set_text(TTR("Joypad Button Index:")); - device_index->clear(); - for (int i = 0; i < JOY_BUTTON_MAX; i++) { - Ref<InputEventJoypadButton> jb; - jb.instance(); - jb->set_button_index(i); - device_index->add_item(jb->as_text()); - } - device_input->popup_centered(Size2(350, 95) * EDSCALE); - - Ref<InputEventJoypadButton> jb = p_exiting_event; - if (jb.is_valid()) { - device_index->select(jb->get_button_index()); - _set_current_device(jb->get_device()); - device_input->get_ok_button()->set_text(TTR("Change")); - } else { - _set_current_device(0); - device_input->get_ok_button()->set_text(TTR("Add")); - } - - } break; - default: { - } - } -} - -void InputMapEditor::_action_activated() { - TreeItem *ti = input_editor->get_selected(); - - if (!ti || ti->get_parent() == input_editor->get_root()) { - return; - } - - String name = "input/" + ti->get_parent()->get_text(0); - Dictionary action = ProjectSettings::get_singleton()->get(name); - Array events = action["events"]; - int idx = ti->get_metadata(0); - - ERR_FAIL_INDEX(idx, events.size()); - Ref<InputEvent> event = events[idx]; - if (event.is_null()) { - return; - } - - add_at = name; - edit_idx = idx; - _edit_item(event); -} - -void InputMapEditor::_action_button_pressed(Object *p_obj, int p_column, int p_id) { - TreeItem *ti = Object::cast_to<TreeItem>(p_obj); - - ERR_FAIL_COND(!ti); - - if (p_id == 1) { - // Add action event - Point2 ofs = input_editor->get_global_position(); - Rect2 ir = input_editor->get_item_rect(ti); - ir.position.y -= input_editor->get_scroll().y; - ofs += ir.position + ir.size; - ofs.x -= 100; - popup_add->set_position(ofs); - popup_add->popup(); - add_at = "input/" + ti->get_text(0); - edit_idx = -1; - - } else if (p_id == 2) { - // Remove - - if (ti->get_parent() == input_editor->get_root()) { - // Remove action - String name = "input/" + ti->get_text(0); - Dictionary old_val = ProjectSettings::get_singleton()->get(name); - int order = ProjectSettings::get_singleton()->get_order(name); - - undo_redo->create_action(TTR("Erase Input Action")); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "clear", name); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, old_val); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", name, order); - undo_redo->add_do_method(this, "_update_actions"); - undo_redo->add_undo_method(this, "_update_actions"); - undo_redo->add_do_method(this, "emit_signal", inputmap_changed); - undo_redo->add_undo_method(this, "emit_signal", inputmap_changed); - undo_redo->commit_action(); - - } else { - // Remove action event - String name = "input/" + ti->get_parent()->get_text(0); - Dictionary old_val = ProjectSettings::get_singleton()->get(name); - Dictionary action = old_val.duplicate(); - int idx = ti->get_metadata(0); - - Array events = action["events"]; - ERR_FAIL_INDEX(idx, events.size()); - events.remove(idx); - action["events"] = events; - - undo_redo->create_action(TTR("Erase Input Action Event")); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, action); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, old_val); - undo_redo->add_do_method(this, "_update_actions"); - undo_redo->add_undo_method(this, "_update_actions"); - undo_redo->add_do_method(this, "emit_signal", inputmap_changed); - undo_redo->add_undo_method(this, "emit_signal", inputmap_changed); - undo_redo->commit_action(); - } - } else if (p_id == 3) { - // Edit - - if (ti->get_parent() == input_editor->get_root()) { - // Edit action name - ti->set_as_cursor(0); - input_editor->edit_selected(); - - } else { - // Edit action event - String name = "input/" + ti->get_parent()->get_text(0); - int idx = ti->get_metadata(0); - Dictionary action = ProjectSettings::get_singleton()->get(name); - - Array events = action["events"]; - ERR_FAIL_INDEX(idx, events.size()); - - Ref<InputEvent> event = events[idx]; - - if (event.is_null()) { - return; - } - - ti->set_as_cursor(0); - add_at = name; - edit_idx = idx; - _edit_item(event); - } - } -} - -void InputMapEditor::_update_actions() { - if (setting) { - return; - } - - Map<String, bool> collapsed; - - if (input_editor->get_root() && input_editor->get_root()->get_children()) { - for (TreeItem *item = input_editor->get_root()->get_children(); item; item = item->get_next()) { - collapsed[item->get_text(0)] = item->is_collapsed(); - } - } - - input_editor->clear(); - TreeItem *root = input_editor->create_item(); - input_editor->set_hide_root(true); - - List<PropertyInfo> props; - ProjectSettings::get_singleton()->get_property_list(&props); - for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) { - const String property_name = E->get().name; - - if (!property_name.begins_with("input/")) { - continue; - } - - const String name = property_name.get_slice("/", 1); - - TreeItem *item = input_editor->create_item(root); - item->set_text(0, name); - item->set_custom_bg_color(0, input_editor->get_theme_color("prop_subsection", "Editor")); - if (collapsed.has(name)) { - item->set_collapsed(collapsed[name]); - } - - item->set_editable(1, true); - item->set_cell_mode(1, TreeItem::CELL_MODE_RANGE); - item->set_range_config(1, 0.0, 1.0, 0.01); - - item->set_custom_bg_color(1, input_editor->get_theme_color("prop_subsection", "Editor")); - - const bool is_builtin_input = ProjectSettings::get_singleton()->get_input_presets().find(property_name) != nullptr; - const String tooltip_remove = is_builtin_input ? TTR("Built-in actions can't be removed as they're used for UI navigation.") : TTR("Remove"); - item->add_button(2, input_editor->get_theme_icon("Add", "EditorIcons"), 1, false, TTR("Add Event")); - item->add_button(2, input_editor->get_theme_icon("Remove", "EditorIcons"), 2, false, tooltip_remove); - - if (is_builtin_input) { - item->set_button_disabled(2, 1, true); - } else { - item->set_editable(0, true); - } - - Dictionary action = ProjectSettings::get_singleton()->get(property_name); - Array events = action["events"]; - item->set_range(1, action["deadzone"]); - - for (int i = 0; i < events.size(); i++) { - Ref<InputEvent> event = events[i]; - if (event.is_null()) { - continue; - } - - TreeItem *action2 = input_editor->create_item(item); - - Ref<InputEventKey> k = event; - if (k.is_valid()) { - if (k->get_keycode() != 0) { - action2->set_text(0, keycode_get_string(k->get_keycode_with_modifiers())); - action2->set_icon(0, input_editor->get_theme_icon("Keyboard", "EditorIcons")); - } else { - action2->set_text(0, keycode_get_string(k->get_physical_keycode_with_modifiers()) + TTR(" (Physical)")); - action2->set_icon(0, input_editor->get_theme_icon("KeyboardPhysical", "EditorIcons")); - } - } - - Ref<InputEventJoypadButton> jb = event; - if (jb.is_valid()) { - action2->set_text(0, jb->as_text()); - action2->set_icon(0, input_editor->get_theme_icon("JoyButton", "EditorIcons")); - } - - Ref<InputEventMouseButton> mb = event; - if (mb.is_valid()) { - String str = _get_device_string(mb->get_device()) + ", "; - switch (mb->get_button_index()) { - case BUTTON_LEFT: - str += TTR("Left Button"); - break; - case BUTTON_RIGHT: - str += TTR("Right Button"); - break; - case BUTTON_MIDDLE: - str += TTR("Middle Button"); - break; - case BUTTON_WHEEL_UP: - str += TTR("Wheel Up"); - break; - case BUTTON_WHEEL_DOWN: - str += TTR("Wheel Down"); - break; - default: - str += vformat(TTR("%d Button"), mb->get_button_index()); - } - - action2->set_text(0, str); - action2->set_icon(0, input_editor->get_theme_icon("Mouse", "EditorIcons")); - } - - Ref<InputEventJoypadMotion> jm = event; - if (jm.is_valid()) { - device_index->add_item(_get_joypad_motion_event_text(jm)); - action2->set_text(0, jm->as_text()); - action2->set_icon(0, input_editor->get_theme_icon("JoyAxis", "EditorIcons")); - } - action2->set_metadata(0, i); - action2->set_meta("__input", event); - - action2->add_button(2, input_editor->get_theme_icon("Edit", "EditorIcons"), 3, false, TTR("Edit")); - action2->add_button(2, input_editor->get_theme_icon("Remove", "EditorIcons"), 2, false, TTR("Remove")); - // Fade out the individual event buttons slightly to make the - // Add/Remove buttons stand out more. - action2->set_button_color(2, 0, Color(1, 1, 1, 0.75)); - action2->set_button_color(2, 1, Color(1, 1, 1, 0.75)); - } - } - - _action_check(action_name->get_text()); -} - -void InputMapEditor::_action_check(String p_action) { - if (p_action == "") { - action_add->set_disabled(true); - } else { - if (!_validate_action_name(p_action)) { - action_add_error->set_text(TTR("Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or '\"'.")); - action_add_error->show(); - action_add->set_disabled(true); - return; - } - if (ProjectSettings::get_singleton()->has_setting("input/" + p_action)) { - action_add_error->set_text(vformat(TTR("An action with the name '%s' already exists."), p_action)); - action_add_error->show(); - action_add->set_disabled(true); - return; - } - - action_add->set_disabled(false); - } - - action_add_error->hide(); -} - -void InputMapEditor::_action_adds(String) { - if (!action_add->is_disabled()) { - _action_add(); - } -} - -void InputMapEditor::_action_add() { - Dictionary action; - action["events"] = Array(); - action["deadzone"] = 0.5f; - String name = "input/" + action_name->get_text(); - undo_redo->create_action(TTR("Add Input Action")); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, action); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "clear", name); - undo_redo->add_do_method(this, "_update_actions"); - undo_redo->add_undo_method(this, "_update_actions"); - undo_redo->add_do_method(this, "emit_signal", inputmap_changed); - undo_redo->add_undo_method(this, "emit_signal", inputmap_changed); - undo_redo->commit_action(); - - TreeItem *r = input_editor->get_root(); - - if (!r) { - return; - } - r = r->get_children(); - if (!r) { - return; - } - while (r->get_next()) { - r = r->get_next(); - } - - r->select(0); - input_editor->ensure_cursor_is_visible(); - action_add_error->hide(); - action_name->clear(); -} - -Variant InputMapEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) { - TreeItem *selected = input_editor->get_selected(); - if (!selected || selected->get_parent() != input_editor->get_root()) { - return Variant(); - } - - String name = selected->get_text(0); - VBoxContainer *vb = memnew(VBoxContainer); - HBoxContainer *hb = memnew(HBoxContainer); - Label *label = memnew(Label(name)); - hb->set_modulate(Color(1, 1, 1, 1.0f)); - hb->add_child(label); - vb->add_child(hb); - input_editor->set_drag_preview(vb); - - Dictionary drag_data; - drag_data["type"] = "nodes"; - - input_editor->set_drop_mode_flags(Tree::DROP_MODE_INBETWEEN); - - return drag_data; -} - -bool InputMapEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const { - Dictionary d = p_data; - if (!d.has("type") || d["type"] != "nodes") { - return false; - } - - TreeItem *selected = input_editor->get_selected(); - TreeItem *item = input_editor->get_item_at_position(p_point); - if (!selected || !item || item == selected || item->get_parent() == selected) { - return false; - } - - return true; -} - -void InputMapEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) { - if (!can_drop_data_fw(p_point, p_data, p_from)) { - return; - } - - TreeItem *selected = input_editor->get_selected(); - TreeItem *item = input_editor->get_item_at_position(p_point); - if (!item) { - return; - } - TreeItem *target = item->get_parent() == input_editor->get_root() ? item : item->get_parent(); - - String selected_name = "input/" + selected->get_text(0); - int old_order = ProjectSettings::get_singleton()->get_order(selected_name); - String target_name = "input/" + target->get_text(0); - int target_order = ProjectSettings::get_singleton()->get_order(target_name); - - int order = old_order; - bool is_below = target_order > old_order; - TreeItem *iterator = is_below ? selected->get_next() : selected->get_prev(); - - undo_redo->create_action(TTR("Moved Input Action Event")); - while (iterator != target) { - String iterator_name = "input/" + iterator->get_text(0); - int iterator_order = ProjectSettings::get_singleton()->get_order(iterator_name); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set_order", iterator_name, order); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", iterator_name, iterator_order); - order = iterator_order; - iterator = is_below ? iterator->get_next() : iterator->get_prev(); - } - - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set_order", target_name, order); - undo_redo->add_do_method(ProjectSettings::get_singleton(), "set_order", selected_name, target_order); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", target_name, target_order); - undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", selected_name, old_order); - - undo_redo->add_do_method(this, "_update_actions"); - undo_redo->add_undo_method(this, "_update_actions"); - undo_redo->add_do_method(this, "emit_signal", inputmap_changed); - undo_redo->add_undo_method(this, "emit_signal", inputmap_changed); - undo_redo->commit_action(); -} - -void InputMapEditor::_bind_methods() { - ClassDB::bind_method(D_METHOD("_update_actions"), &InputMapEditor::_update_actions); - - ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &InputMapEditor::get_drag_data_fw); - ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &InputMapEditor::can_drop_data_fw); - ClassDB::bind_method(D_METHOD("drop_data_fw"), &InputMapEditor::drop_data_fw); - - ADD_SIGNAL(MethodInfo("inputmap_changed")); -} - -InputMapEditor::InputMapEditor() { - undo_redo = EditorNode::get_undo_redo(); - press_a_key_physical = false; - inputmap_changed = "inputmap_changed"; - - VBoxContainer *vbc = memnew(VBoxContainer); - vbc->set_anchor_and_offset(SIDE_TOP, Control::ANCHOR_BEGIN, 0); - vbc->set_anchor_and_offset(SIDE_BOTTOM, Control::ANCHOR_END, 0); - vbc->set_anchor_and_offset(SIDE_LEFT, Control::ANCHOR_BEGIN, 0); - vbc->set_anchor_and_offset(SIDE_RIGHT, Control::ANCHOR_END, 0); - add_child(vbc); - - HBoxContainer *hbc = memnew(HBoxContainer); - vbc->add_child(hbc); - - Label *l = memnew(Label); - l->set_text(TTR("Action:")); - hbc->add_child(l); - - action_name = memnew(LineEdit); - action_name->set_h_size_flags(Control::SIZE_EXPAND_FILL); - action_name->connect("text_entered", callable_mp(this, &InputMapEditor::_action_adds)); - action_name->connect("text_changed", callable_mp(this, &InputMapEditor::_action_check)); - hbc->add_child(action_name); - - action_add_error = memnew(Label); - action_add_error->hide(); - hbc->add_child(action_add_error); - - Button *add = memnew(Button); - add->set_text(TTR("Add")); - add->set_disabled(true); - add->connect("pressed", callable_mp(this, &InputMapEditor::_action_add)); - hbc->add_child(add); - action_add = add; - - input_editor = memnew(Tree); - input_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL); - input_editor->set_columns(3); - input_editor->set_column_titles_visible(true); - input_editor->set_column_title(0, TTR("Action")); - input_editor->set_column_title(1, TTR("Deadzone")); - input_editor->set_column_expand(1, false); - input_editor->set_column_min_width(1, 80 * EDSCALE); - input_editor->set_column_expand(2, false); - input_editor->set_column_min_width(2, 50 * EDSCALE); - input_editor->connect("item_edited", callable_mp(this, &InputMapEditor::_action_edited)); - input_editor->connect("item_activated", callable_mp(this, &InputMapEditor::_action_activated)); - input_editor->connect("cell_selected", callable_mp(this, &InputMapEditor::_action_selected)); - input_editor->connect("button_pressed", callable_mp(this, &InputMapEditor::_action_button_pressed)); -#ifndef _MSC_VER -#warning need to make drag data forwarding to non controls happen -#endif - //input_editor->set_drag_forwarding(this); - vbc->add_child(input_editor); - - // Popups - - popup_add = memnew(PopupMenu); - popup_add->connect("id_pressed", callable_mp(this, &InputMapEditor::_add_item), make_binds(Ref<InputEvent>())); - add_child(popup_add); - - press_a_key = memnew(ConfirmationDialog); - press_a_key->get_ok_button()->set_disabled(true); - //press_a_key->set_focus_mode(Control::FOCUS_ALL); - press_a_key->connect("window_input", callable_mp(this, &InputMapEditor::_wait_for_key)); - press_a_key->connect("confirmed", callable_mp(this, &InputMapEditor::_press_a_key_confirm)); - add_child(press_a_key); - - l = memnew(Label); - l->set_text(TTR("Press a Key...")); - l->set_anchors_and_offsets_preset(Control::PRESET_WIDE); - l->set_align(Label::ALIGN_CENTER); - l->set_offset(SIDE_TOP, 20); - l->set_anchor_and_offset(SIDE_BOTTOM, Control::ANCHOR_BEGIN, 30); - press_a_key->add_child(l); - press_a_key_label = l; - - device_input = memnew(ConfirmationDialog); - device_input->get_ok_button()->set_text(TTR("Add")); - device_input->connect("confirmed", callable_mp(this, &InputMapEditor::_device_input_add)); - add_child(device_input); - - hbc = memnew(HBoxContainer); - device_input->add_child(hbc); - - VBoxContainer *vbc_left = memnew(VBoxContainer); - hbc->add_child(vbc_left); - - l = memnew(Label); - l->set_text(TTR("Device:")); - vbc_left->add_child(l); - - device_id = memnew(OptionButton); - for (int i = -1; i < 8; i++) { - device_id->add_item(_get_device_string(i)); - } - _set_current_device(0); - vbc_left->add_child(device_id); - - VBoxContainer *vbc_right = memnew(VBoxContainer); - vbc_right->set_h_size_flags(Control::SIZE_EXPAND_FILL); - hbc->add_child(vbc_right); - - l = memnew(Label); - l->set_text(TTR("Index:")); - vbc_right->add_child(l); - - device_index_label = l; - device_index = memnew(OptionButton); - device_index->set_clip_text(true); - vbc_right->add_child(device_index); - - message = memnew(AcceptDialog); - add_child(message); -} diff --git a/editor/input_map_editor.h b/editor/input_map_editor.h deleted file mode 100644 index cc6ac1660d..0000000000 --- a/editor/input_map_editor.h +++ /dev/null @@ -1,109 +0,0 @@ -/*************************************************************************/ -/* input_map_editor.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2021 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 INPUT_MAP_EDITOR_H -#define INPUT_MAP_EDITOR_H - -#include "core/object/undo_redo.h" -#include "editor/editor_data.h" - -class InputMapEditor : public Control { - GDCLASS(InputMapEditor, Control); - - enum InputType { - INPUT_KEY, - INPUT_KEY_PHYSICAL, - INPUT_JOY_BUTTON, - INPUT_JOY_MOTION, - INPUT_MOUSE_BUTTON - }; - - Tree *input_editor; - LineEdit *action_name; - Button *action_add; - Label *action_add_error; - - InputType add_type; - String add_at; - int edit_idx; - - PopupMenu *popup_add; - ConfirmationDialog *press_a_key; - bool press_a_key_physical; - Label *press_a_key_label; - ConfirmationDialog *device_input; - OptionButton *device_id; - OptionButton *device_index; - Label *device_index_label; - MenuButton *popup_copy_to_feature; - - Ref<InputEventKey> last_wait_for_key; - - AcceptDialog *message; - UndoRedo *undo_redo; - String inputmap_changed; - bool setting = false; - - void _update_actions(); - void _add_item(int p_item, Ref<InputEvent> p_exiting_event = Ref<InputEvent>()); - void _edit_item(Ref<InputEvent> p_exiting_event); - - void _action_check(String p_action); - void _action_adds(String); - void _action_add(); - void _device_input_add(); - - void _action_selected(); - void _action_edited(); - void _action_activated(); - void _action_button_pressed(Object *p_obj, int p_column, int p_id); - void _wait_for_key(const Ref<InputEvent> &p_event); - void _press_a_key_confirm(); - void _show_last_added(const Ref<InputEvent> &p_event, const String &p_name); - - String _get_joypad_motion_event_text(const Ref<InputEventJoypadMotion> &p_event); - - Variant get_drag_data_fw(const Point2 &p_point, Control *p_from); - bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; - void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); - -protected: - int _get_current_device(); - void _set_current_device(int i_device); - String _get_device_string(int i_device); - - void _notification(int p_what); - static void _bind_methods(); - -public: - InputMapEditor(); -}; - -#endif // INPUT_MAP_EDITOR_H diff --git a/editor/localization_editor.cpp b/editor/localization_editor.cpp index 60553143d5..0e68af06f0 100644 --- a/editor/localization_editor.cpp +++ b/editor/localization_editor.cpp @@ -84,7 +84,7 @@ void LocalizationEditor::add_translation(const String &p_translation) { } void LocalizationEditor::_translation_add(const PackedStringArray &p_paths) { - PackedStringArray translations = ProjectSettings::get_singleton()->get("locale/translations"); + PackedStringArray translations = ProjectSettings::get_singleton()->get("internationalization/locale/translations"); for (int i = 0; i < p_paths.size(); i++) { if (!translations.has(p_paths[i])) { // Don't add duplicate translation paths. @@ -93,8 +93,8 @@ void LocalizationEditor::_translation_add(const PackedStringArray &p_paths) { } undo_redo->create_action(vformat(TTR("Add %d Translations"), p_paths.size())); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translations", translations); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translations", ProjectSettings::get_singleton()->get("locale/translations")); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/translations", translations); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/translations", ProjectSettings::get_singleton()->get("internationalization/locale/translations")); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -112,15 +112,15 @@ void LocalizationEditor::_translation_delete(Object *p_item, int p_column, int p int idx = ti->get_metadata(0); - PackedStringArray translations = ProjectSettings::get_singleton()->get("locale/translations"); + PackedStringArray translations = ProjectSettings::get_singleton()->get("internationalization/locale/translations"); ERR_FAIL_INDEX(idx, translations.size()); translations.remove(idx); undo_redo->create_action(TTR("Remove Translation")); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translations", translations); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translations", ProjectSettings::get_singleton()->get("locale/translations")); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/translations", translations); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/translations", ProjectSettings::get_singleton()->get("internationalization/locale/translations")); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -136,8 +136,8 @@ void LocalizationEditor::_translation_res_add(const PackedStringArray &p_paths) Variant prev; Dictionary remaps; - if (ProjectSettings::get_singleton()->has_setting("locale/translation_remaps")) { - remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps"); + if (ProjectSettings::get_singleton()->has_setting("internationalization/locale/translation_remaps")) { + remaps = ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps"); prev = remaps; } @@ -149,8 +149,8 @@ void LocalizationEditor::_translation_res_add(const PackedStringArray &p_paths) } undo_redo->create_action(vformat(TTR("Translation Resource Remap: Add %d Path(s)"), p_paths.size())); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translation_remaps", remaps); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translation_remaps", prev); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/translation_remaps", remaps); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/translation_remaps", prev); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -163,9 +163,9 @@ void LocalizationEditor::_translation_res_option_file_open() { } void LocalizationEditor::_translation_res_option_add(const PackedStringArray &p_paths) { - ERR_FAIL_COND(!ProjectSettings::get_singleton()->has_setting("locale/translation_remaps")); + ERR_FAIL_COND(!ProjectSettings::get_singleton()->has_setting("internationalization/locale/translation_remaps")); - Dictionary remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps"); + Dictionary remaps = ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps"); TreeItem *k = translation_remap->get_selected(); ERR_FAIL_COND(!k); @@ -180,8 +180,8 @@ void LocalizationEditor::_translation_res_option_add(const PackedStringArray &p_ remaps[key] = r; undo_redo->create_action(vformat(TTR("Translation Resource Remap: Add %d Remap(s)"), p_paths.size())); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translation_remaps", remaps); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translation_remaps", ProjectSettings::get_singleton()->get("locale/translation_remaps")); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/translation_remaps", remaps); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/translation_remaps", ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps")); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -202,11 +202,11 @@ void LocalizationEditor::_translation_res_option_changed() { return; } - if (!ProjectSettings::get_singleton()->has_setting("locale/translation_remaps")) { + if (!ProjectSettings::get_singleton()->has_setting("internationalization/locale/translation_remaps")) { return; } - Dictionary remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps"); + Dictionary remaps = ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps"); TreeItem *k = translation_remap->get_selected(); ERR_FAIL_COND(!k); @@ -234,8 +234,8 @@ void LocalizationEditor::_translation_res_option_changed() { updating_translations = true; undo_redo->create_action(TTR("Change Resource Remap Language")); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translation_remaps", remaps); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translation_remaps", ProjectSettings::get_singleton()->get("locale/translation_remaps")); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/translation_remaps", remaps); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/translation_remaps", ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps")); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -249,11 +249,11 @@ void LocalizationEditor::_translation_res_delete(Object *p_item, int p_column, i return; } - if (!ProjectSettings::get_singleton()->has_setting("locale/translation_remaps")) { + if (!ProjectSettings::get_singleton()->has_setting("internationalization/locale/translation_remaps")) { return; } - Dictionary remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps"); + Dictionary remaps = ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps"); TreeItem *k = Object::cast_to<TreeItem>(p_item); @@ -263,8 +263,8 @@ void LocalizationEditor::_translation_res_delete(Object *p_item, int p_column, i remaps.erase(key); undo_redo->create_action(TTR("Remove Resource Remap")); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translation_remaps", remaps); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translation_remaps", ProjectSettings::get_singleton()->get("locale/translation_remaps")); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/translation_remaps", remaps); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/translation_remaps", ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps")); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -277,11 +277,11 @@ void LocalizationEditor::_translation_res_option_delete(Object *p_item, int p_co return; } - if (!ProjectSettings::get_singleton()->has_setting("locale/translation_remaps")) { + if (!ProjectSettings::get_singleton()->has_setting("internationalization/locale/translation_remaps")) { return; } - Dictionary remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps"); + Dictionary remaps = ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps"); TreeItem *k = translation_remap->get_selected(); ERR_FAIL_COND(!k); @@ -298,8 +298,8 @@ void LocalizationEditor::_translation_res_option_delete(Object *p_item, int p_co remaps[key] = r; undo_redo->create_action(TTR("Remove Resource Remap Option")); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translation_remaps", remaps); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translation_remaps", ProjectSettings::get_singleton()->get("locale/translation_remaps")); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/translation_remaps", remaps); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/translation_remaps", ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps")); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -316,8 +316,8 @@ void LocalizationEditor::_translation_filter_option_changed() { Variant prev; Array f_locales_all; - if (ProjectSettings::get_singleton()->has_setting("locale/locale_filter")) { - f_locales_all = ProjectSettings::get_singleton()->get("locale/locale_filter"); + if (ProjectSettings::get_singleton()->has_setting("internationalization/locale/locale_filter")) { + f_locales_all = ProjectSettings::get_singleton()->get("internationalization/locale/locale_filter"); prev = f_locales_all; if (f_locales_all.size() != 2) { @@ -346,8 +346,8 @@ void LocalizationEditor::_translation_filter_option_changed() { f_locales.sort(); undo_redo->create_action(TTR("Changed Locale Filter")); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/locale_filter", f_locales_all); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/locale_filter", prev); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/locale_filter", f_locales_all); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/locale_filter", prev); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -361,8 +361,8 @@ void LocalizationEditor::_translation_filter_mode_changed(int p_mode) { Variant prev; Array f_locales_all; - if (ProjectSettings::get_singleton()->has_setting("locale/locale_filter")) { - f_locales_all = ProjectSettings::get_singleton()->get("locale/locale_filter"); + if (ProjectSettings::get_singleton()->has_setting("internationalization/locale/locale_filter")) { + f_locales_all = ProjectSettings::get_singleton()->get("internationalization/locale/locale_filter"); prev = f_locales_all; if (f_locales_all.size() != 2) { @@ -378,8 +378,8 @@ void LocalizationEditor::_translation_filter_mode_changed(int p_mode) { } undo_redo->create_action(TTR("Changed Locale Filter Mode")); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/locale_filter", f_locales_all); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/locale_filter", prev); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/locale_filter", f_locales_all); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/locale_filter", prev); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -388,7 +388,7 @@ void LocalizationEditor::_translation_filter_mode_changed(int p_mode) { } void LocalizationEditor::_pot_add(const PackedStringArray &p_paths) { - PackedStringArray pot_translations = ProjectSettings::get_singleton()->get("locale/translations_pot_files"); + PackedStringArray pot_translations = ProjectSettings::get_singleton()->get("internationalization/locale/translations_pot_files"); for (int i = 0; i < p_paths.size(); i++) { for (int j = 0; j < pot_translations.size(); j++) { @@ -401,8 +401,8 @@ void LocalizationEditor::_pot_add(const PackedStringArray &p_paths) { } undo_redo->create_action(vformat(TTR("Add %d file(s) for POT generation"), p_paths.size())); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translations_pot_files", pot_translations); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translations_pot_files", ProjectSettings::get_singleton()->get("locale/translations_pot_files")); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/translations_pot_files", pot_translations); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/translations_pot_files", ProjectSettings::get_singleton()->get("internationalization/locale/translations_pot_files")); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -416,15 +416,15 @@ void LocalizationEditor::_pot_delete(Object *p_item, int p_column, int p_button) int idx = ti->get_metadata(0); - PackedStringArray pot_translations = ProjectSettings::get_singleton()->get("locale/translations_pot_files"); + PackedStringArray pot_translations = ProjectSettings::get_singleton()->get("internationalization/locale/translations_pot_files"); ERR_FAIL_INDEX(idx, pot_translations.size()); pot_translations.remove(idx); undo_redo->create_action(TTR("Remove file from POT generation")); - undo_redo->add_do_property(ProjectSettings::get_singleton(), "locale/translations_pot_files", pot_translations); - undo_redo->add_undo_property(ProjectSettings::get_singleton(), "locale/translations_pot_files", ProjectSettings::get_singleton()->get("locale/translations_pot_files")); + undo_redo->add_do_property(ProjectSettings::get_singleton(), "internationalization/locale/translations_pot_files", pot_translations); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "internationalization/locale/translations_pot_files", ProjectSettings::get_singleton()->get("internationalization/locale/translations_pot_files")); undo_redo->add_do_method(this, "update_translations"); undo_redo->add_undo_method(this, "update_translations"); undo_redo->add_do_method(this, "emit_signal", localization_changed); @@ -463,8 +463,8 @@ void LocalizationEditor::update_translations() { translation_list->clear(); TreeItem *root = translation_list->create_item(nullptr); translation_list->set_hide_root(true); - if (ProjectSettings::get_singleton()->has_setting("locale/translations")) { - PackedStringArray translations = ProjectSettings::get_singleton()->get("locale/translations"); + if (ProjectSettings::get_singleton()->has_setting("internationalization/locale/translations")) { + PackedStringArray translations = ProjectSettings::get_singleton()->get("internationalization/locale/translations"); for (int i = 0; i < translations.size(); i++) { TreeItem *t = translation_list->create_item(root); t->set_editable(0, false); @@ -482,8 +482,8 @@ void LocalizationEditor::update_translations() { Array l_filter_all; bool is_arr_empty = true; - if (ProjectSettings::get_singleton()->has_setting("locale/locale_filter")) { - l_filter_all = ProjectSettings::get_singleton()->get("locale/locale_filter"); + if (ProjectSettings::get_singleton()->has_setting("internationalization/locale/locale_filter")) { + l_filter_all = ProjectSettings::get_singleton()->get("internationalization/locale/locale_filter"); if (l_filter_all.size() == 2) { translation_locale_filter_mode->select(l_filter_all[0]); @@ -573,8 +573,8 @@ void LocalizationEditor::update_translations() { } } - if (ProjectSettings::get_singleton()->has_setting("locale/translation_remaps")) { - Dictionary remaps = ProjectSettings::get_singleton()->get("locale/translation_remaps"); + if (ProjectSettings::get_singleton()->has_setting("internationalization/locale/translation_remaps")) { + Dictionary remaps = ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps"); List<Variant> rk; remaps.get_key_list(&rk); Vector<String> keys; @@ -631,8 +631,8 @@ void LocalizationEditor::update_translations() { translation_pot_list->clear(); root = translation_pot_list->create_item(nullptr); translation_pot_list->set_hide_root(true); - if (ProjectSettings::get_singleton()->has_setting("locale/translations_pot_files")) { - PackedStringArray pot_translations = ProjectSettings::get_singleton()->get("locale/translations_pot_files"); + if (ProjectSettings::get_singleton()->has_setting("internationalization/locale/translations_pot_files")) { + PackedStringArray pot_translations = ProjectSettings::get_singleton()->get("internationalization/locale/translations_pot_files"); for (int i = 0; i < pot_translations.size(); i++) { TreeItem *t = translation_pot_list->create_item(root); t->set_editable(0, false); diff --git a/editor/node_3d_editor_gizmos.cpp b/editor/node_3d_editor_gizmos.cpp index bd825d0802..7dcabafece 100644 --- a/editor/node_3d_editor_gizmos.cpp +++ b/editor/node_3d_editor_gizmos.cpp @@ -198,7 +198,11 @@ void EditorNode3DGizmo::add_mesh(const Ref<ArrayMesh> &p_mesh, bool p_billboard, } void EditorNode3DGizmo::add_lines(const Vector<Vector3> &p_lines, const Ref<Material> &p_material, bool p_billboard, const Color &p_modulate) { - if (p_lines.is_empty()) { + add_vertices(p_lines, p_material, Mesh::PRIMITIVE_LINES, p_billboard, p_modulate); +} + +void EditorNode3DGizmo::add_vertices(const Vector<Vector3> &p_vertices, const Ref<Material> &p_material, Mesh::PrimitiveType p_primitive_type, bool p_billboard, const Color &p_modulate) { + if (p_vertices.is_empty()) { return; } @@ -209,13 +213,13 @@ void EditorNode3DGizmo::add_lines(const Vector<Vector3> &p_lines, const Ref<Mate Array a; a.resize(Mesh::ARRAY_MAX); - a[Mesh::ARRAY_VERTEX] = p_lines; + a[Mesh::ARRAY_VERTEX] = p_vertices; Vector<Color> color; - color.resize(p_lines.size()); + color.resize(p_vertices.size()); { Color *w = color.ptrw(); - for (int i = 0; i < p_lines.size(); i++) { + for (int i = 0; i < p_vertices.size(); i++) { if (is_selected()) { w[i] = Color(1, 1, 1, 0.8) * p_modulate; } else { @@ -226,13 +230,13 @@ void EditorNode3DGizmo::add_lines(const Vector<Vector3> &p_lines, const Ref<Mate a[Mesh::ARRAY_COLOR] = color; - mesh->add_surface_from_arrays(Mesh::PRIMITIVE_LINES, a); + mesh->add_surface_from_arrays(p_primitive_type, a); mesh->surface_set_material(0, p_material); if (p_billboard) { float md = 0; - for (int i = 0; i < p_lines.size(); i++) { - md = MAX(0, p_lines[i].length()); + for (int i = 0; i < p_vertices.size(); i++) { + md = MAX(0, p_vertices[i].length()); } if (md) { mesh->set_custom_aabb(AABB(Vector3(-md, -md, -md), Vector3(md, md, md) * 2.0)); @@ -557,7 +561,7 @@ bool EditorNode3DGizmo::intersect_ray(Camera3D *p_camera, const Point2 &p_point, Transform t = spatial_node->get_global_transform(); Vector3 camera_position = p_camera->get_camera_transform().origin; if (camera_position.distance_squared_to(t.origin) > 0.01) { - t.set_look_at(t.origin, camera_position, Vector3(0, 1, 0)); + t.set_look_at(t.origin, camera_position); } float scale = t.origin.distance_to(p_camera->get_camera_transform().origin); @@ -574,7 +578,7 @@ bool EditorNode3DGizmo::intersect_ray(Camera3D *p_camera, const Point2 &p_point, if (orig_camera_transform.origin.distance_squared_to(t.origin) > 0.01 && ABS(orig_camera_transform.basis.get_axis(Vector3::AXIS_Z).dot(Vector3(0, 1, 0))) < 0.99) { - p_camera->look_at(t.origin, Vector3(0, 1, 0)); + p_camera->look_at(t.origin); } Vector3 c0 = t.xform(Vector3(selectable_icon_size, selectable_icon_size, 0) * scale); @@ -1906,16 +1910,15 @@ void RayCast3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { p_gizmo->clear(); - Vector<Vector3> lines; + const Ref<StandardMaterial3D> material = raycast->is_enabled() ? raycast->get_debug_material() : get_material("shape_material_disabled"); - lines.push_back(Vector3()); - lines.push_back(raycast->get_target_position()); + p_gizmo->add_lines(raycast->get_debug_line_vertices(), material); - const Ref<StandardMaterial3D> material = - get_material(raycast->is_enabled() ? "shape_material" : "shape_material_disabled", p_gizmo); + if (raycast->get_debug_shape_thickness() > 1) { + p_gizmo->add_vertices(raycast->get_debug_shape_vertices(), material, Mesh::PRIMITIVE_TRIANGLE_STRIP); + } - p_gizmo->add_lines(lines, material); - p_gizmo->add_collision_segments(lines); + p_gizmo->add_collision_segments(raycast->get_debug_line_vertices()); } ///// @@ -2070,7 +2073,13 @@ void SoftBody3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { Ref<TriangleMesh> tm = soft_body->get_mesh()->generate_triangle_mesh(); Vector<Vector3> points; - soft_body->get_mesh()->generate_debug_mesh_indices(points); + for (int i = 0; i < soft_body->get_mesh()->get_surface_count(); i++) { + Array arrays = soft_body->get_mesh()->surface_get_arrays(i); + ERR_CONTINUE(arrays.is_empty()); + + const Vector<Vector3> &vertices = arrays[Mesh::ARRAY_VERTEX]; + points.append_array(vertices); + } Ref<Material> material = get_material("shape_material", p_gizmo); @@ -3505,6 +3514,57 @@ void LightmapProbeGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { //// +CollisionObject3DGizmoPlugin::CollisionObject3DGizmoPlugin() { + const Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1)); + create_material("shape_material", gizmo_color); + const float gizmo_value = gizmo_color.get_v(); + const Color gizmo_color_disabled = Color(gizmo_value, gizmo_value, gizmo_value, 0.65); + create_material("shape_material_disabled", gizmo_color_disabled); +} + +bool CollisionObject3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { + return Object::cast_to<CollisionObject3D>(p_spatial) != nullptr; +} + +String CollisionObject3DGizmoPlugin::get_gizmo_name() const { + return "CollisionObject3D"; +} + +int CollisionObject3DGizmoPlugin::get_priority() const { + return -2; +} + +void CollisionObject3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { + CollisionObject3D *co = Object::cast_to<CollisionObject3D>(p_gizmo->get_spatial_node()); + + p_gizmo->clear(); + + List<uint32_t> owners; + co->get_shape_owners(&owners); + for (List<uint32_t>::Element *E = owners.front(); E; E = E->next()) { + uint32_t owner_id = E->get(); + Transform xform = co->shape_owner_get_transform(owner_id); + Object *owner = co->shape_owner_get_owner(owner_id); + // Exclude CollisionShape3D and CollisionPolygon3D as they have their gizmo. + if (!Object::cast_to<CollisionShape3D>(owner) && !Object::cast_to<CollisionPolygon3D>(owner)) { + Ref<Material> material = get_material(!co->is_shape_owner_disabled(owner_id) ? "shape_material" : "shape_material_disabled", p_gizmo); + for (int shape_id = 0; shape_id < co->shape_owner_get_shape_count(owner_id); shape_id++) { + Ref<Shape3D> s = co->shape_owner_get_shape(owner_id, shape_id); + if (s.is_null()) { + continue; + } + SurfaceTool st; + st.append_from(s->get_debug_mesh(), 0, xform); + + p_gizmo->add_mesh(st.commit(), false, Ref<SkinReference>(), material); + p_gizmo->add_collision_segments(s->get_debug_mesh_lines()); + } + } + } +} + +//// + CollisionShape3DGizmoPlugin::CollisionShape3DGizmoPlugin() { const Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1)); create_material("shape_material", gizmo_color); diff --git a/editor/node_3d_editor_gizmos.h b/editor/node_3d_editor_gizmos.h index df4ed15a8e..6f98d3a08c 100644 --- a/editor/node_3d_editor_gizmos.h +++ b/editor/node_3d_editor_gizmos.h @@ -355,6 +355,18 @@ public: LightmapProbeGizmoPlugin(); }; +class CollisionObject3DGizmoPlugin : public EditorNode3DGizmoPlugin { + GDCLASS(CollisionObject3DGizmoPlugin, EditorNode3DGizmoPlugin); + +public: + bool has_gizmo(Node3D *p_spatial) override; + String get_gizmo_name() const override; + int get_priority() const override; + void redraw(EditorNode3DGizmo *p_gizmo) override; + + CollisionObject3DGizmoPlugin(); +}; + class CollisionShape3DGizmoPlugin : public EditorNode3DGizmoPlugin { GDCLASS(CollisionShape3DGizmoPlugin, EditorNode3DGizmoPlugin); diff --git a/editor/plugin_config_dialog.cpp b/editor/plugin_config_dialog.cpp index 19c9662162..f496811e0a 100644 --- a/editor/plugin_config_dialog.cpp +++ b/editor/plugin_config_dialog.cpp @@ -86,7 +86,7 @@ void PluginConfigDialog::_on_confirmed() { // Hard-coded GDScript template to keep usability until we use script templates. Ref<Script> gdscript = memnew(GDScript); gdscript->set_source_code( - "tool\n" + "@tool\n" "extends EditorPlugin\n" "\n" "\n" @@ -112,7 +112,7 @@ void PluginConfigDialog::_on_confirmed() { } #endif - emit_signal("plugin_ready", script.operator->(), active_edit->is_pressed() ? subfolder_edit->get_text() : ""); + emit_signal("plugin_ready", script.operator->(), active_edit->is_pressed() ? _to_absolute_plugin_path(subfolder_edit->get_text()) : ""); } else { EditorNode::get_singleton()->get_project_settings()->update_plugins(); } @@ -129,6 +129,10 @@ void PluginConfigDialog::_on_required_text_changed(const String &) { get_ok_button()->set_disabled(script_edit->get_text().get_basename().is_empty() || script_edit->get_text().get_extension() != ext || name_edit->get_text().is_empty()); } +String PluginConfigDialog::_to_absolute_plugin_path(const String &p_plugin_name) { + return "res://addons/" + p_plugin_name + "/plugin.cfg"; +} + void PluginConfigDialog::_notification(int p_what) { switch (p_what) { case NOTIFICATION_VISIBILITY_CHANGED: { diff --git a/editor/plugin_config_dialog.h b/editor/plugin_config_dialog.h index 50ca417d81..f49f14c881 100644 --- a/editor/plugin_config_dialog.h +++ b/editor/plugin_config_dialog.h @@ -56,6 +56,8 @@ class PluginConfigDialog : public ConfirmationDialog { void _on_cancelled(); void _on_required_text_changed(const String &p_text); + static String _to_absolute_plugin_path(const String &p_plugin_name); + protected: virtual void _notification(int p_what); static void _bind_methods(); diff --git a/editor/plugins/abstract_polygon_2d_editor.cpp b/editor/plugins/abstract_polygon_2d_editor.cpp index 876b67fa77..80d0a7db60 100644 --- a/editor/plugins/abstract_polygon_2d_editor.cpp +++ b/editor/plugins/abstract_polygon_2d_editor.cpp @@ -264,7 +264,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) Vector2 cpoint = _get_node()->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mb->get_position()))); if (mode == MODE_EDIT || (_is_line() && mode == MODE_CREATE)) { - if (mb->get_button_index() == BUTTON_LEFT) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->is_pressed()) { if (mb->get_control() || mb->get_shift() || mb->get_alt()) { return false; @@ -326,7 +326,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) return true; } } - } else if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed() && !edited_point.valid()) { + } else if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed() && !edited_point.valid()) { const PosVertex closest = closest_point(gpoint); if (closest.valid()) { @@ -335,7 +335,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) } } } else if (mode == MODE_DELETE) { - if (mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed()) { const PosVertex closest = closest_point(gpoint); if (closest.valid()) { @@ -346,7 +346,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) } if (mode == MODE_CREATE) { - if (mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed()) { if (_is_line()) { // for lines, we don't have a wip mode, and we can undo each single add point. Vector<Vector2> vertices = _get_polygon(0); @@ -384,7 +384,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) return true; } } - } else if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed() && wip_active) { + } else if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed() && wip_active) { _wip_cancel(); } } @@ -395,7 +395,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) if (mm.is_valid()) { Vector2 gpoint = mm->get_position(); - if (edited_point.valid() && (wip_active || (mm->get_button_mask() & BUTTON_MASK_LEFT))) { + if (edited_point.valid() && (wip_active || (mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT))) { Vector2 cpoint = _get_node()->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint))); //Move the point in a single axis. Should only work when editing a polygon and while holding shift. @@ -585,11 +585,11 @@ void AbstractPolygon2DEditor::edit(Node *p_polygon) { edited_point = PosVertex(); hover_point = Vertex(); selected_point = Vertex(); - - canvas_item_editor->update_viewport(); } else { _set_node(nullptr); } + + canvas_item_editor->update_viewport(); } void AbstractPolygon2DEditor::_bind_methods() { diff --git a/editor/plugins/animation_blend_space_1d_editor.cpp b/editor/plugins/animation_blend_space_1d_editor.cpp index d69913cc46..025fcaf818 100644 --- a/editor/plugins/animation_blend_space_1d_editor.cpp +++ b/editor/plugins/animation_blend_space_1d_editor.cpp @@ -51,7 +51,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && ((tool_select->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) || (mb->get_button_index() == BUTTON_LEFT && tool_create->is_pressed()))) { + if (mb.is_valid() && mb->is_pressed() && ((tool_select->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) || (mb->get_button_index() == MOUSE_BUTTON_LEFT && tool_create->is_pressed()))) { menu->clear(); animations_menu->clear(); animations_to_add.clear(); @@ -110,7 +110,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven } } - if (mb.is_valid() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { blend_space_draw->update(); // why not // try to see if a point can be selected @@ -132,7 +132,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven } } - if (mb.is_valid() && !mb->is_pressed() && dragging_selected_attempt && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && !mb->is_pressed() && dragging_selected_attempt && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (dragging_selected) { // move float point = blend_space->get_blend_point_position(selected_point); @@ -161,7 +161,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven } // *set* the blend - if (mb.is_valid() && !mb->is_pressed() && tool_blend->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && !mb->is_pressed() && tool_blend->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { float blend_pos = mb->get_position().x / blend_space_draw->get_size().x; blend_pos *= blend_space->get_max_space() - blend_space->get_min_space(); blend_pos += blend_space->get_min_space(); @@ -184,7 +184,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven _update_edited_point_pos(); } - if (mm.is_valid() && tool_blend->is_pressed() && mm->get_button_mask() & BUTTON_MASK_LEFT) { + if (mm.is_valid() && tool_blend->is_pressed() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { float blend_pos = mm->get_position().x / blend_space_draw->get_size().x; blend_pos *= blend_space->get_max_space() - blend_space->get_min_space(); blend_pos += blend_space->get_min_space(); diff --git a/editor/plugins/animation_blend_space_2d_editor.cpp b/editor/plugins/animation_blend_space_2d_editor.cpp index 6a57463dbc..af9c391174 100644 --- a/editor/plugins/animation_blend_space_2d_editor.cpp +++ b/editor/plugins/animation_blend_space_2d_editor.cpp @@ -79,7 +79,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && ((tool_select->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) || (mb->get_button_index() == BUTTON_LEFT && tool_create->is_pressed()))) { + if (mb.is_valid() && mb->is_pressed() && ((tool_select->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) || (mb->get_button_index() == MOUSE_BUTTON_LEFT && tool_create->is_pressed()))) { menu->clear(); animations_menu->clear(); animations_to_add.clear(); @@ -134,7 +134,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven } } - if (mb.is_valid() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { blend_space_draw->update(); //update anyway //try to see if a point can be selected selected_point = -1; @@ -174,7 +174,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven } } - if (mb.is_valid() && mb->is_pressed() && tool_triangle->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && tool_triangle->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { blend_space_draw->update(); //update anyway //try to see if a point can be selected selected_point = -1; @@ -209,7 +209,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven } } - if (mb.is_valid() && !mb->is_pressed() && dragging_selected_attempt && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && !mb->is_pressed() && dragging_selected_attempt && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (dragging_selected) { //move Vector2 point = blend_space->get_blend_point_position(selected_point); @@ -236,7 +236,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven blend_space_draw->update(); } - if (mb.is_valid() && mb->is_pressed() && tool_blend->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && tool_blend->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { Vector2 blend_pos = (mb->get_position() / blend_space_draw->get_size()); blend_pos.y = 1.0 - blend_pos.y; blend_pos *= (blend_space->get_max_space() - blend_space->get_min_space()); @@ -270,7 +270,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven blend_space_draw->update(); } - if (mm.is_valid() && tool_blend->is_pressed() && mm->get_button_mask() & BUTTON_MASK_LEFT) { + if (mm.is_valid() && tool_blend->is_pressed() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { Vector2 blend_pos = (mm->get_position() / blend_space_draw->get_size()); blend_pos.y = 1.0 - blend_pos.y; blend_pos *= (blend_space->get_max_space() - blend_space->get_min_space()); diff --git a/editor/plugins/animation_blend_tree_editor_plugin.cpp b/editor/plugins/animation_blend_tree_editor_plugin.cpp index e7e069e8b6..fdbbe5184b 100644 --- a/editor/plugins/animation_blend_tree_editor_plugin.cpp +++ b/editor/plugins/animation_blend_tree_editor_plugin.cpp @@ -139,7 +139,7 @@ void AnimationNodeBlendTreeEditor::_update_graph() { name->set_expand_to_text_length(true); node->add_child(name); node->set_slot(0, false, 0, Color(), true, 0, get_theme_color("font_color", "Label")); - name->connect("text_entered", callable_mp(this, &AnimationNodeBlendTreeEditor::_node_renamed), varray(agnode)); + name->connect("text_entered", callable_mp(this, &AnimationNodeBlendTreeEditor::_node_renamed), varray(agnode), CONNECT_DEFERRED); name->connect("focus_exited", callable_mp(this, &AnimationNodeBlendTreeEditor::_node_renamed_focus_out), varray(name, agnode), CONNECT_DEFERRED); base = 1; node->set_show_close_button(true); diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp index 56d82acd2f..7c623505b5 100644 --- a/editor/plugins/animation_player_editor_plugin.cpp +++ b/editor/plugins/animation_player_editor_plugin.cpp @@ -78,7 +78,6 @@ void AnimationPlayerEditor::_notification(int p_what) { } frame->set_value(player->get_current_animation_position()); track_editor->set_anim_pos(player->get_current_animation_position()); - EditorNode::get_singleton()->get_inspector()->refresh(); } else if (!player->is_valid()) { // Reset timeline when the player has been stopped externally @@ -1072,8 +1071,6 @@ void AnimationPlayerEditor::_animation_key_editor_seek(float p_pos, bool p_drag) frame->set_value(Math::snapped(p_pos, _get_editor_step())); updating = false; _seek_value_changed(p_pos, !p_drag); - - EditorNode::get_singleton()->get_inspector()->refresh(); } void AnimationPlayerEditor::_animation_tool_menu(int p_option) { @@ -1400,7 +1397,7 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() { // Render every past/future step with the capture shader. RS::get_singleton()->canvas_item_set_material(onion.capture.canvas_item, onion.capture.material->get_rid()); - onion.capture.material->set_shader_param("bkg_color", GLOBAL_GET("rendering/environment/default_clear_color")); + onion.capture.material->set_shader_param("bkg_color", GLOBAL_GET("rendering/environment/defaults/default_clear_color")); onion.capture.material->set_shader_param("differences_only", onion.differences_only); onion.capture.material->set_shader_param("present", onion.differences_only ? RS::get_singleton()->viewport_get_texture(present_rid) : RID()); diff --git a/editor/plugins/animation_state_machine_editor.cpp b/editor/plugins/animation_state_machine_editor.cpp index c6d2faf849..a9709bbb16 100644 --- a/editor/plugins/animation_state_machine_editor.cpp +++ b/editor/plugins/animation_state_machine_editor.cpp @@ -76,7 +76,7 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv Ref<InputEventMouseButton> mb = p_event; //Add new node - if (mb.is_valid() && mb->is_pressed() && ((tool_select->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) || (tool_create->is_pressed() && mb->get_button_index() == BUTTON_LEFT))) { + if (mb.is_valid() && mb->is_pressed() && ((tool_select->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) || (tool_create->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT))) { menu->clear(); animations_menu->clear(); animations_to_add.clear(); @@ -124,7 +124,7 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv } // select node or push a field inside - if (mb.is_valid() && !mb->get_shift() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && !mb->get_shift() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { selected_transition_from = StringName(); selected_transition_to = StringName(); selected_node = StringName(); @@ -216,7 +216,7 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv } //end moving node - if (mb.is_valid() && dragging_selected_attempt && mb->get_button_index() == BUTTON_LEFT && !mb->is_pressed()) { + if (mb.is_valid() && dragging_selected_attempt && mb->get_button_index() == MOUSE_BUTTON_LEFT && !mb->is_pressed()) { if (dragging_selected) { Ref<AnimationNode> an = state_machine->get_node(selected_node); updating = true; @@ -237,7 +237,7 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv } //connect nodes - if (mb.is_valid() && ((tool_select->is_pressed() && mb->get_shift()) || tool_connect->is_pressed()) && mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) { + if (mb.is_valid() && ((tool_select->is_pressed() && mb->get_shift()) || tool_connect->is_pressed()) && mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed()) { for (int i = node_rects.size() - 1; i >= 0; i--) { //inverse to draw order if (node_rects[i].node.has_point(mb->get_position())) { //select node since nothing else was selected connecting = true; @@ -250,7 +250,7 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv } //end connecting nodes - if (mb.is_valid() && connecting && mb->get_button_index() == BUTTON_LEFT && !mb->is_pressed()) { + if (mb.is_valid() && connecting && mb->get_button_index() == MOUSE_BUTTON_LEFT && !mb->is_pressed()) { if (connecting_to_node != StringName()) { if (state_machine->has_transition(connecting_from, connecting_to_node)) { EditorNode::get_singleton()->show_warning(TTR("Transition exists!")); @@ -284,7 +284,7 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv Ref<InputEventMouseMotion> mm = p_event; //pan window - if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_MIDDLE) { + if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE) { h_scroll->set_value(h_scroll->get_value() - mm->get_relative().x); v_scroll->set_value(v_scroll->get_value() - mm->get_relative().y); } diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp index d726cd031e..b7484aa748 100644 --- a/editor/plugins/asset_library_editor_plugin.cpp +++ b/editor/plugins/asset_library_editor_plugin.cpp @@ -350,7 +350,7 @@ void EditorAssetLibraryItemDownload::_http_download_completed(int p_status, int if (sha256 != download_sha256) { error_text = TTR("Bad download hash, assuming file has been tampered with.") + "\n"; error_text += TTR("Expected:") + " " + sha256 + "\n" + TTR("Got:") + " " + download_sha256; - status->set_text(TTR("Failed sha256 hash check")); + status->set_text(TTR("Failed SHA-256 hash check")); } } } break; @@ -359,6 +359,8 @@ void EditorAssetLibraryItemDownload::_http_download_completed(int p_status, int if (error_text != String()) { download_error->set_text(TTR("Asset Download Error:") + "\n" + error_text); download_error->popup_centered(); + // Let the user retry the download. + retry->show(); return; } @@ -459,6 +461,9 @@ void EditorAssetLibraryItemDownload::_install() { } void EditorAssetLibraryItemDownload::_make_request() { + // Hide the Retry button if we've just pressed it. + retry->hide(); + download->cancel_request(); download->set_download_file(EditorSettings::get_singleton()->get_cache_dir().plus_file("tmp_asset_" + itos(asset_id)) + ".zip"); @@ -516,6 +521,8 @@ EditorAssetLibraryItemDownload::EditorAssetLibraryItemDownload() { retry = memnew(Button); retry->set_text(TTR("Retry")); retry->connect("pressed", callable_mp(this, &EditorAssetLibraryItemDownload::_make_request)); + // Only show the Retry button in case of a failure. + retry->hide(); hb2->add_child(retry); hb2->add_child(install); @@ -577,6 +584,24 @@ void EditorAssetLibrary::_notification(int p_what) { filter->set_right_icon(get_theme_icon("Search", "EditorIcons")); filter->set_clear_button_enabled(true); } break; + + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { + _update_repository_options(); + } break; + } +} + +void EditorAssetLibrary::_update_repository_options() { + Dictionary default_urls; + default_urls["godotengine.org"] = "https://godotengine.org/asset-library/api"; + default_urls["localhost"] = "http://127.0.0.1/asset-library/api"; + Dictionary available_urls = _EDITOR_DEF("asset_library/available_urls", default_urls, true); + repository->clear(); + Array keys = available_urls.keys(); + for (int i = 0; i < available_urls.size(); i++) { + String key = keys[i]; + repository->add_item(key); + repository->set_item_metadata(i, available_urls[key]); } } @@ -962,14 +987,16 @@ HBoxContainer *EditorAssetLibrary::_make_pages(int p_page, int p_page_count, int for (int i = from; i < to; i++) { if (i == p_page) { Button *current = memnew(Button); - current->set_text(itos(i + 1)); + // Keep the extended padding for the currently active page (see below). + current->set_text(vformat(" %d ", i + 1)); current->set_disabled(true); current->set_focus_mode(Control::FOCUS_NONE); hbc->add_child(current); } else { Button *current = memnew(Button); - current->set_text(itos(i + 1)); + // Add padding to make page number buttons easier to click. + current->set_text(vformat(" %d ", i + 1)); current->connect("pressed", callable_mp(this, &EditorAssetLibrary::_search), varray(i)); hbc->add_child(current); @@ -1364,18 +1391,7 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) { search_hb2->add_child(memnew(Label(TTR("Site:") + " "))); repository = memnew(OptionButton); - { - Dictionary default_urls; - default_urls["godotengine.org"] = "https://godotengine.org/asset-library/api"; - default_urls["localhost"] = "http://127.0.0.1/asset-library/api"; - Dictionary available_urls = _EDITOR_DEF("asset_library/available_urls", default_urls, true); - Array keys = available_urls.keys(); - for (int i = 0; i < available_urls.size(); i++) { - String key = keys[i]; - repository->add_item(key); - repository->set_item_metadata(i, available_urls[key]); - } - } + _update_repository_options(); repository->connect("item_selected", callable_mp(this, &EditorAssetLibrary::_repository_changed)); @@ -1387,6 +1403,7 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) { support = memnew(MenuButton); search_hb2->add_child(support); support->set_text(TTR("Support")); + support->get_popup()->set_hide_on_checkable_item_selection(false); support->get_popup()->add_check_item(TTR("Official"), SUPPORT_OFFICIAL); support->get_popup()->add_check_item(TTR("Community"), SUPPORT_COMMUNITY); support->get_popup()->add_check_item(TTR("Testing"), SUPPORT_TESTING); diff --git a/editor/plugins/asset_library_editor_plugin.h b/editor/plugins/asset_library_editor_plugin.h index 0509145673..11eae9e041 100644 --- a/editor/plugins/asset_library_editor_plugin.h +++ b/editor/plugins/asset_library_editor_plugin.h @@ -176,6 +176,7 @@ class EditorAssetLibrary : public PanelContainer { void _asset_open(); void _asset_file_selected(const String &p_file); + void _update_repository_options(); PanelContainer *library_scroll_bg; ScrollContainer *library_scroll; diff --git a/editor/plugins/audio_stream_editor_plugin.cpp b/editor/plugins/audio_stream_editor_plugin.cpp index 1765c99572..3553450672 100644 --- a/editor/plugins/audio_stream_editor_plugin.cpp +++ b/editor/plugins/audio_stream_editor_plugin.cpp @@ -96,7 +96,7 @@ void AudioStreamEditor::_preview_changed(ObjectID p_which) { } } -void AudioStreamEditor::_changed_callback(Object *p_changed, const char *p_prop) { +void AudioStreamEditor::_audio_changed() { if (!is_visible()) { return; } @@ -105,6 +105,8 @@ void AudioStreamEditor::_changed_callback(Object *p_changed, const char *p_prop) void AudioStreamEditor::_play() { if (_player->is_playing()) { + // '_pausing' variable indicates that we want to pause the audio player, not stop it. See '_on_finished()'. + _pausing = true; _player->stop(); _play_button->set_icon(get_theme_icon("MainPlay", "EditorIcons")); set_process(false); @@ -125,10 +127,13 @@ void AudioStreamEditor::_stop() { void AudioStreamEditor::_on_finished() { _play_button->set_icon(get_theme_icon("MainPlay", "EditorIcons")); - if (_current == _player->get_stream()->get_length()) { + if (!_pausing) { _current = 0; _indicator->update(); + } else { + _pausing = false; } + set_process(false); } void AudioStreamEditor::_draw_indicator() { @@ -172,7 +177,7 @@ void AudioStreamEditor::_seek_to(real_t p_x) { void AudioStreamEditor::edit(Ref<AudioStream> p_stream) { if (!stream.is_null()) { - stream->remove_change_receptor(this); + stream->disconnect("changed", callable_mp(this, &AudioStreamEditor::_audio_changed)); } stream = p_stream; @@ -182,7 +187,7 @@ void AudioStreamEditor::edit(Ref<AudioStream> p_stream) { _duration_label->set_text(text); if (!stream.is_null()) { - stream->add_change_receptor(this); + stream->connect("changed", callable_mp(this, &AudioStreamEditor::_audio_changed)); update(); } else { hide(); @@ -194,8 +199,6 @@ void AudioStreamEditor::_bind_methods() { AudioStreamEditor::AudioStreamEditor() { set_custom_minimum_size(Size2(1, 100) * EDSCALE); - _current = 0; - _dragging = false; _player = memnew(AudioStreamPlayer); _player->connect("finished", callable_mp(this, &AudioStreamEditor::_on_finished)); diff --git a/editor/plugins/audio_stream_editor_plugin.h b/editor/plugins/audio_stream_editor_plugin.h index f27add7229..14e829d025 100644 --- a/editor/plugins/audio_stream_editor_plugin.h +++ b/editor/plugins/audio_stream_editor_plugin.h @@ -41,17 +41,20 @@ class AudioStreamEditor : public ColorRect { GDCLASS(AudioStreamEditor, ColorRect); Ref<AudioStream> stream; - AudioStreamPlayer *_player; - ColorRect *_preview; - Control *_indicator; - Label *_current_label; - Label *_duration_label; + AudioStreamPlayer *_player = nullptr; + ColorRect *_preview = nullptr; + Control *_indicator = nullptr; + Label *_current_label = nullptr; + Label *_duration_label = nullptr; - Button *_play_button; - Button *_stop_button; + Button *_play_button = nullptr; + Button *_stop_button = nullptr; - float _current; - bool _dragging; + float _current = 0; + bool _dragging = false; + bool _pausing = false; + + void _audio_changed(); protected: void _notification(int p_what); @@ -63,7 +66,6 @@ protected: void _draw_indicator(); void _on_input_indicator(Ref<InputEvent> p_event); void _seek_to(real_t p_x); - void _changed_callback(Object *p_changed, const char *p_prop) override; static void _bind_methods(); public: diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index d92837b68d..d4e06aa9ca 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -629,9 +629,9 @@ void CanvasItemEditor::_get_canvas_items_at_pos(const Point2 &p_pos, Vector<_Sel Node *node = r_items[i].item; // Make sure the selected node is in the current scene, or editable - while (node && node != get_tree()->get_edited_scene_root() && node->get_owner() != scene && !scene->is_editable_instance(node->get_owner())) { - node = node->get_parent(); - }; + if (node && node != get_tree()->get_edited_scene_root()) { + node = scene->get_deepest_editable_node(node); + } CanvasItem *canvas_item = Object::cast_to<CanvasItem>(node); if (!p_allow_locked) { @@ -762,7 +762,7 @@ void CanvasItemEditor::_find_canvas_items_in_rect(const Rect2 &p_rect, Node *p_n CanvasItem *canvas_item = Object::cast_to<CanvasItem>(p_node); Node *scene = editor->get_edited_scene(); - bool editable = p_node == scene || p_node->get_owner() == scene || scene->is_editable_instance(p_node->get_owner()); + bool editable = p_node == scene || p_node->get_owner() == scene || p_node == scene->get_deepest_editable_node(p_node); bool lock_children = p_node->has_meta("_edit_group_") && p_node->get_meta("_edit_group_"); bool locked = _is_node_locked(p_node); @@ -955,9 +955,11 @@ void CanvasItemEditor::_restore_canvas_item_state(List<CanvasItem *> p_canvas_it for (List<CanvasItem *>::Element *E = drag_selection.front(); E; E = E->next()) { CanvasItem *canvas_item = E->get(); CanvasItemEditorSelectedItem *se = editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item); - canvas_item->_edit_set_state(se->undo_state); - if (restore_bones) { - _restore_canvas_item_ik_chain(canvas_item, &(se->pre_drag_bones_undo_state)); + if (se) { + canvas_item->_edit_set_state(se->undo_state); + if (restore_bones) { + _restore_canvas_item_ik_chain(canvas_item, &(se->pre_drag_bones_undo_state)); + } } } } @@ -982,13 +984,15 @@ void CanvasItemEditor::_commit_canvas_item_state(List<CanvasItem *> p_canvas_ite for (List<CanvasItem *>::Element *E = modified_canvas_items.front(); E; E = E->next()) { CanvasItem *canvas_item = E->get(); CanvasItemEditorSelectedItem *se = editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item); - undo_redo->add_do_method(canvas_item, "_edit_set_state", canvas_item->_edit_get_state()); - undo_redo->add_undo_method(canvas_item, "_edit_set_state", se->undo_state); - if (commit_bones) { - for (List<Dictionary>::Element *F = se->pre_drag_bones_undo_state.front(); F; F = F->next()) { - canvas_item = Object::cast_to<CanvasItem>(canvas_item->get_parent()); - undo_redo->add_do_method(canvas_item, "_edit_set_state", canvas_item->_edit_get_state()); - undo_redo->add_undo_method(canvas_item, "_edit_set_state", F->get()); + if (se) { + undo_redo->add_do_method(canvas_item, "_edit_set_state", canvas_item->_edit_get_state()); + undo_redo->add_undo_method(canvas_item, "_edit_set_state", se->undo_state); + if (commit_bones) { + for (List<Dictionary>::Element *F = se->pre_drag_bones_undo_state.front(); F; F = F->next()) { + canvas_item = Object::cast_to<CanvasItem>(canvas_item->get_parent()); + undo_redo->add_do_method(canvas_item, "_edit_set_state", canvas_item->_edit_get_state()); + undo_redo->add_undo_method(canvas_item, "_edit_set_state", F->get()); + } } } } @@ -1021,6 +1025,32 @@ void CanvasItemEditor::_selection_menu_hide() { selection_menu->set_size(Vector2(0, 0)); } +void CanvasItemEditor::_add_node_pressed(int p_result) { + if (p_result == AddNodeOption::ADD_NODE) { + editor->get_scene_tree_dock()->open_add_child_dialog(); + } else if (p_result == AddNodeOption::ADD_INSTANCE) { + editor->get_scene_tree_dock()->open_instance_child_dialog(); + } +} + +void CanvasItemEditor::_node_created(Node *p_node) { + if (node_create_position == Point2()) { + return; + } + + CanvasItem *c = Object::cast_to<CanvasItem>(p_node); + if (c) { + Transform2D xform = c->get_global_transform_with_canvas().affine_inverse() * c->get_transform(); + c->_edit_set_position(xform.xform(node_create_position)); + } + + call_deferred("_reset_create_position"); // Defer the call in case more than one node is added. +} + +void CanvasItemEditor::_reset_create_position() { + node_create_position = Point2(); +} + bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> b = p_event; Ref<InputEventMouseMotion> m = p_event; @@ -1065,7 +1095,7 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve } // Start dragging a guide - if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed()) { // Press button if (b->get_position().x < RULER_WIDTH && b->get_position().y < RULER_WIDTH) { // Drag a new double guide @@ -1124,7 +1154,7 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve } // Release confirms the guide move - if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && !b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && !b->is_pressed()) { if (show_guides && EditorNode::get_singleton()->get_edited_scene()) { Transform2D xform = viewport_scrollable->get_transform() * transform; @@ -1238,7 +1268,7 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo if (pan_on_scroll) { // Perform horizontal scrolling first so we can check for Shift being held. if (b->is_pressed() && - (b->get_button_index() == BUTTON_WHEEL_LEFT || (b->get_shift() && b->get_button_index() == BUTTON_WHEEL_UP))) { + (b->get_button_index() == MOUSE_BUTTON_WHEEL_LEFT || (b->get_shift() && b->get_button_index() == MOUSE_BUTTON_WHEEL_UP))) { // Pan left view_offset.x -= int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor(); update_viewport(); @@ -1246,7 +1276,7 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo } if (b->is_pressed() && - (b->get_button_index() == BUTTON_WHEEL_RIGHT || (b->get_shift() && b->get_button_index() == BUTTON_WHEEL_DOWN))) { + (b->get_button_index() == MOUSE_BUTTON_WHEEL_RIGHT || (b->get_shift() && b->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN))) { // Pan right view_offset.x += int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor(); update_viewport(); @@ -1254,7 +1284,7 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo } } - if (b->is_pressed() && b->get_button_index() == BUTTON_WHEEL_DOWN) { + if (b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { // Scroll or pan down if (pan_on_scroll) { view_offset.y += int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor(); @@ -1269,7 +1299,7 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo return true; } - if (b->is_pressed() && b->get_button_index() == BUTTON_WHEEL_UP) { + if (b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { // Scroll or pan up if (pan_on_scroll) { view_offset.y -= int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor(); @@ -1286,17 +1316,17 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo if (!panning) { if (b->is_pressed() && - (b->get_button_index() == BUTTON_MIDDLE || - b->get_button_index() == BUTTON_RIGHT || - (b->get_button_index() == BUTTON_LEFT && tool == TOOL_PAN) || - (b->get_button_index() == BUTTON_LEFT && !EditorSettings::get_singleton()->get("editors/2d/simple_panning") && pan_pressed))) { + (b->get_button_index() == MOUSE_BUTTON_MIDDLE || + b->get_button_index() == MOUSE_BUTTON_RIGHT || + (b->get_button_index() == MOUSE_BUTTON_LEFT && tool == TOOL_PAN) || + (b->get_button_index() == MOUSE_BUTTON_LEFT && !EditorSettings::get_singleton()->get("editors/2d/simple_panning") && pan_pressed))) { // Pan the viewport panning = true; } } if (panning) { - if (!b->is_pressed() && (pan_on_scroll || (b->get_button_index() != BUTTON_WHEEL_DOWN && b->get_button_index() != BUTTON_WHEEL_UP))) { + if (!b->is_pressed() && (pan_on_scroll || (b->get_button_index() != MOUSE_BUTTON_WHEEL_DOWN && b->get_button_index() != MOUSE_BUTTON_WHEEL_UP))) { // Stop panning the viewport (for any mouse button press except zooming) panning = false; } @@ -1382,7 +1412,7 @@ bool CanvasItemEditor::_gui_input_pivot(const Ref<InputEvent> &p_event) { // Drag the pivot (in pivot mode / with V key) if (drag_type == DRAG_NONE) { - if ((b.is_valid() && b->is_pressed() && b->get_button_index() == BUTTON_LEFT && tool == TOOL_EDIT_PIVOT) || + if ((b.is_valid() && b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_LEFT && tool == TOOL_EDIT_PIVOT) || (k.is_valid() && k->is_pressed() && !k->is_echo() && k->get_keycode() == KEY_V)) { List<CanvasItem *> selection = _get_edited_canvas_items(); @@ -1436,7 +1466,7 @@ bool CanvasItemEditor::_gui_input_pivot(const Ref<InputEvent> &p_event) { // Confirm the pivot move if (drag_selection.size() >= 1 && - ((b.is_valid() && !b->is_pressed() && b->get_button_index() == BUTTON_LEFT && tool == TOOL_EDIT_PIVOT) || + ((b.is_valid() && !b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_LEFT && tool == TOOL_EDIT_PIVOT) || (k.is_valid() && !k->is_pressed() && k->get_keycode() == KEY_V))) { _commit_canvas_item_state( drag_selection, @@ -1450,7 +1480,7 @@ bool CanvasItemEditor::_gui_input_pivot(const Ref<InputEvent> &p_event) { } // Cancel a drag - if (b.is_valid() && b->get_button_index() == BUTTON_RIGHT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection); drag_type = DRAG_NONE; viewport->update(); @@ -1536,7 +1566,7 @@ bool CanvasItemEditor::_gui_input_rotate(const Ref<InputEvent> &p_event) { // Start rotation if (drag_type == DRAG_NONE) { - if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed()) { if ((b->get_command() && !b->get_alt() && tool == TOOL_SELECT) || tool == TOOL_ROTATE) { List<CanvasItem *> selection = _get_edited_canvas_items(); @@ -1580,7 +1610,7 @@ bool CanvasItemEditor::_gui_input_rotate(const Ref<InputEvent> &p_event) { } // Confirms the node rotation - if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && !b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && !b->is_pressed()) { if (drag_selection.size() != 1) { _commit_canvas_item_state( drag_selection, @@ -1604,7 +1634,7 @@ bool CanvasItemEditor::_gui_input_rotate(const Ref<InputEvent> &p_event) { } // Cancel a drag - if (b.is_valid() && b->get_button_index() == BUTTON_RIGHT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection); drag_type = DRAG_NONE; viewport->update(); @@ -1618,7 +1648,7 @@ bool CanvasItemEditor::_gui_input_open_scene_on_double_click(const Ref<InputEven Ref<InputEventMouseButton> b = p_event; // Open a sub-scene on double-click - if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && b->is_pressed() && b->is_doubleclick() && tool == TOOL_SELECT) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed() && b->is_doubleclick() && tool == TOOL_SELECT) { List<CanvasItem *> selection = _get_edited_canvas_items(); if (selection.size() == 1) { CanvasItem *canvas_item = selection[0]; @@ -1637,7 +1667,7 @@ bool CanvasItemEditor::_gui_input_anchors(const Ref<InputEvent> &p_event) { // Starts anchor dragging if needed if (drag_type == DRAG_NONE) { - if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && b->is_pressed() && tool == TOOL_SELECT) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed() && tool == TOOL_SELECT) { List<CanvasItem *> selection = _get_edited_canvas_items(); if (selection.size() == 1) { Control *control = Object::cast_to<Control>(selection[0]); @@ -1757,7 +1787,7 @@ bool CanvasItemEditor::_gui_input_anchors(const Ref<InputEvent> &p_event) { } // Confirms new anchor position - if (drag_selection.size() >= 1 && b.is_valid() && b->get_button_index() == BUTTON_LEFT && !b->is_pressed()) { + if (drag_selection.size() >= 1 && b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && !b->is_pressed()) { _commit_canvas_item_state( drag_selection, vformat(TTR("Move CanvasItem \"%s\" Anchor"), drag_selection[0]->get_name())); @@ -1766,7 +1796,7 @@ bool CanvasItemEditor::_gui_input_anchors(const Ref<InputEvent> &p_event) { } // Cancel a drag - if (b.is_valid() && b->get_button_index() == BUTTON_RIGHT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection); drag_type = DRAG_NONE; viewport->update(); @@ -1782,7 +1812,7 @@ bool CanvasItemEditor::_gui_input_resize(const Ref<InputEvent> &p_event) { // Drag resize handles if (drag_type == DRAG_NONE) { - if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && b->is_pressed() && tool == TOOL_SELECT) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed() && tool == TOOL_SELECT) { List<CanvasItem *> selection = _get_edited_canvas_items(); if (selection.size() == 1) { CanvasItem *canvas_item = selection[0]; @@ -1936,7 +1966,7 @@ bool CanvasItemEditor::_gui_input_resize(const Ref<InputEvent> &p_event) { } // Confirm resize - if (drag_selection.size() >= 1 && b.is_valid() && b->get_button_index() == BUTTON_LEFT && !b->is_pressed()) { + if (drag_selection.size() >= 1 && b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && !b->is_pressed()) { const Node2D *node2d = Object::cast_to<Node2D>(drag_selection[0]); if (node2d) { // Extends from Node2D. @@ -1973,7 +2003,7 @@ bool CanvasItemEditor::_gui_input_resize(const Ref<InputEvent> &p_event) { } // Cancel a drag - if (b.is_valid() && b->get_button_index() == BUTTON_RIGHT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection); snap_target[0] = SNAP_TARGET_NONE; snap_target[1] = SNAP_TARGET_NONE; @@ -1991,7 +2021,7 @@ bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) { // Drag resize handles if (drag_type == DRAG_NONE) { - if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && b->is_pressed() && ((b->get_alt() && b->get_control()) || tool == TOOL_SCALE)) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed() && ((b->get_alt() && b->get_control()) || tool == TOOL_SCALE)) { List<CanvasItem *> selection = _get_edited_canvas_items(); if (selection.size() == 1) { CanvasItem *canvas_item = selection[0]; @@ -2087,7 +2117,7 @@ bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) { } // Confirm resize - if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && !b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && !b->is_pressed()) { if (drag_selection.size() != 1) { _commit_canvas_item_state( drag_selection, @@ -2112,7 +2142,7 @@ bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) { } // Cancel a drag - if (b.is_valid() && b->get_button_index() == BUTTON_RIGHT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection); drag_type = DRAG_NONE; viewport->update(); @@ -2129,7 +2159,7 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) { if (drag_type == DRAG_NONE) { //Start moving the nodes - if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed()) { if ((b->get_alt() && !b->get_control()) || tool == TOOL_MOVE) { List<CanvasItem *> selection = _get_edited_canvas_items(); @@ -2212,17 +2242,19 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) { for (List<CanvasItem *>::Element *E = drag_selection.front(); E; E = E->next()) { CanvasItem *canvas_item = E->get(); CanvasItemEditorSelectedItem *se = editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item); - Transform2D xform = canvas_item->get_global_transform_with_canvas().affine_inverse() * canvas_item->get_transform(); - - Node2D *node2d = Object::cast_to<Node2D>(canvas_item); - if (node2d && se->pre_drag_bones_undo_state.size() > 0 && !force_no_IK) { - real_t initial_leaf_node_rotation = node2d->get_global_transform_with_canvas().get_rotation(); - _restore_canvas_item_ik_chain(node2d, &(all_bones_ik_states[index])); - real_t final_leaf_node_rotation = node2d->get_global_transform_with_canvas().get_rotation(); - node2d->rotate(initial_leaf_node_rotation - final_leaf_node_rotation); - _solve_IK(node2d, new_pos); - } else { - canvas_item->_edit_set_position(canvas_item->_edit_get_position() + xform.xform(new_pos) - xform.xform(previous_pos)); + if (se) { + Transform2D xform = canvas_item->get_global_transform_with_canvas().affine_inverse() * canvas_item->get_transform(); + + Node2D *node2d = Object::cast_to<Node2D>(canvas_item); + if (node2d && se->pre_drag_bones_undo_state.size() > 0 && !force_no_IK) { + real_t initial_leaf_node_rotation = node2d->get_global_transform_with_canvas().get_rotation(); + _restore_canvas_item_ik_chain(node2d, &(all_bones_ik_states[index])); + real_t final_leaf_node_rotation = node2d->get_global_transform_with_canvas().get_rotation(); + node2d->rotate(initial_leaf_node_rotation - final_leaf_node_rotation); + _solve_IK(node2d, new_pos); + } else { + canvas_item->_edit_set_position(canvas_item->_edit_get_position() + xform.xform(new_pos) - xform.xform(previous_pos)); + } } index++; } @@ -2230,7 +2262,7 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) { } // Confirm the move (only if it was moved) - if (b.is_valid() && !b->is_pressed() && b->get_button_index() == BUTTON_LEFT) { + if (b.is_valid() && !b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_LEFT) { if (transform.affine_inverse().xform(b->get_position()) != drag_from) { if (drag_selection.size() != 1) { _commit_canvas_item_state( @@ -2263,7 +2295,7 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) { } // Cancel a drag - if (b.is_valid() && b->get_button_index() == BUTTON_RIGHT && b->is_pressed()) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->is_pressed()) { _restore_canvas_item_state(drag_selection, true); snap_target[0] = SNAP_TARGET_NONE; snap_target[1] = SNAP_TARGET_NONE; @@ -2346,17 +2378,19 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) { for (List<CanvasItem *>::Element *E = drag_selection.front(); E; E = E->next()) { CanvasItem *canvas_item = E->get(); CanvasItemEditorSelectedItem *se = editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item); - Transform2D xform = canvas_item->get_global_transform_with_canvas().affine_inverse() * canvas_item->get_transform(); - - Node2D *node2d = Object::cast_to<Node2D>(canvas_item); - if (node2d && se->pre_drag_bones_undo_state.size() > 0) { - real_t initial_leaf_node_rotation = node2d->get_global_transform_with_canvas().get_rotation(); - _restore_canvas_item_ik_chain(node2d, &(all_bones_ik_states[index])); - real_t final_leaf_node_rotation = node2d->get_global_transform_with_canvas().get_rotation(); - node2d->rotate(initial_leaf_node_rotation - final_leaf_node_rotation); - _solve_IK(node2d, new_pos); - } else { - canvas_item->_edit_set_position(canvas_item->_edit_get_position() + xform.xform(new_pos) - xform.xform(previous_pos)); + if (se) { + Transform2D xform = canvas_item->get_global_transform_with_canvas().affine_inverse() * canvas_item->get_transform(); + + Node2D *node2d = Object::cast_to<Node2D>(canvas_item); + if (node2d && se->pre_drag_bones_undo_state.size() > 0) { + real_t initial_leaf_node_rotation = node2d->get_global_transform_with_canvas().get_rotation(); + _restore_canvas_item_ik_chain(node2d, &(all_bones_ik_states[index])); + real_t final_leaf_node_rotation = node2d->get_global_transform_with_canvas().get_rotation(); + node2d->rotate(initial_leaf_node_rotation - final_leaf_node_rotation); + _solve_IK(node2d, new_pos); + } else { + canvas_item->_edit_set_position(canvas_item->_edit_get_position() + xform.xform(new_pos) - xform.xform(previous_pos)); + } } index++; } @@ -2401,8 +2435,8 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { if (drag_type == DRAG_NONE) { if (b.is_valid() && - ((b->get_button_index() == BUTTON_RIGHT && b->get_alt() && tool == TOOL_SELECT) || - (b->get_button_index() == BUTTON_LEFT && tool == TOOL_LIST_SELECT))) { + ((b->get_button_index() == MOUSE_BUTTON_RIGHT && b->get_alt() && tool == TOOL_SELECT) || + (b->get_button_index() == MOUSE_BUTTON_LEFT && tool == TOOL_LIST_SELECT))) { // Popup the selection menu list Point2 click = transform.affine_inverse().xform(b->get_position()); @@ -2463,7 +2497,15 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { } } - if (b.is_valid() && b->get_button_index() == BUTTON_LEFT && b->is_pressed() && tool == TOOL_SELECT) { + if (b.is_valid() && b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_RIGHT && b->get_control()) { + add_node_menu->set_position(get_global_transform().xform(get_local_mouse_position())); + add_node_menu->set_size(Vector2(1, 1)); + add_node_menu->popup(); + node_create_position = transform.affine_inverse().xform((get_local_mouse_position())); + return true; + } + + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT && b->is_pressed() && tool == TOOL_SELECT) { // Single item selection Point2 click = transform.affine_inverse().xform(b->get_position()); @@ -2529,7 +2571,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { } if (drag_type == DRAG_BOX_SELECTION) { - if (b.is_valid() && !b->is_pressed() && b->get_button_index() == BUTTON_LEFT) { + if (b.is_valid() && !b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_LEFT) { // Confirms box selection Node *scene = editor->get_edited_scene(); if (scene) { @@ -2555,7 +2597,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { return true; } - if (b.is_valid() && b->is_pressed() && b->get_button_index() == BUTTON_RIGHT) { + if (b.is_valid() && b->is_pressed() && b->get_button_index() == MOUSE_BUTTON_RIGHT) { // Cancel box selection drag_type = DRAG_NONE; viewport->update(); @@ -2580,6 +2622,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) { bool CanvasItemEditor::_gui_input_ruler_tool(const Ref<InputEvent> &p_event) { if (tool != TOOL_RULER) { + ruler_tool_active = false; return false; } @@ -2591,7 +2634,7 @@ bool CanvasItemEditor::_gui_input_ruler_tool(const Ref<InputEvent> &p_event) { ruler_tool_origin = snap_point(viewport->get_local_mouse_position() / zoom + view_offset); } - if (b.is_valid() && b->get_button_index() == BUTTON_LEFT) { + if (b.is_valid() && b->get_button_index() == MOUSE_BUTTON_LEFT) { if (b->is_pressed()) { ruler_tool_active = true; } else { @@ -2868,21 +2911,22 @@ void CanvasItemEditor::_draw_guides() { // Dragged guide Color text_color = get_theme_color("font_color", "Editor"); - text_color.a = 0.5; + Color outline_color = text_color.inverted(); + const float outline_size = 2; if (drag_type == DRAG_DOUBLE_GUIDE || drag_type == DRAG_V_GUIDE) { String str = TS->format_number(vformat("%d px", Math::round(xform.affine_inverse().xform(dragged_guide_pos).x))); - Ref<Font> font = get_theme_font("font", "Label"); - int font_size = get_theme_font_size("font_size", "Label"); + Ref<Font> font = get_theme_font("bold", "EditorFonts"); + int font_size = get_theme_font_size("bold_size", "EditorFonts"); Size2 text_size = font->get_string_size(str, font_size); - viewport->draw_string(font, Point2(dragged_guide_pos.x + 10, RULER_WIDTH + text_size.y / 2 + 10), str, HALIGN_LEFT, -1, font_size, text_color); + viewport->draw_string(font, Point2(dragged_guide_pos.x + 10, RULER_WIDTH + text_size.y / 2 + 10), str, HALIGN_LEFT, -1, font_size, text_color, outline_size, outline_color); viewport->draw_line(Point2(dragged_guide_pos.x, 0), Point2(dragged_guide_pos.x, viewport->get_size().y), guide_color, Math::round(EDSCALE)); } if (drag_type == DRAG_DOUBLE_GUIDE || drag_type == DRAG_H_GUIDE) { String str = TS->format_number(vformat("%d px", Math::round(xform.affine_inverse().xform(dragged_guide_pos).y))); - Ref<Font> font = get_theme_font("font", "Label"); - int font_size = get_theme_font_size("font_size", "Label"); + Ref<Font> font = get_theme_font("bold", "EditorFonts"); + int font_size = get_theme_font_size("bold_size", "EditorFonts"); Size2 text_size = font->get_string_size(str, font_size); - viewport->draw_string(font, Point2(RULER_WIDTH + 10, dragged_guide_pos.y + text_size.y / 2 + 10), str, HALIGN_LEFT, -1, font_size, text_color); + viewport->draw_string(font, Point2(RULER_WIDTH + 10, dragged_guide_pos.y + text_size.y / 2 + 10), str, HALIGN_LEFT, -1, font_size, text_color, outline_size, outline_color); viewport->draw_line(Point2(0, dragged_guide_pos.y), Point2(viewport->get_size().x, dragged_guide_pos.y), guide_color, Math::round(EDSCALE)); } } @@ -3867,7 +3911,7 @@ bool CanvasItemEditor::_build_bones_list(Node *p_node) { CanvasItem *canvas_item = Object::cast_to<CanvasItem>(p_node); Node *scene = editor->get_edited_scene(); - if (!canvas_item || !canvas_item->is_visible() || (canvas_item != scene && canvas_item->get_owner() != scene && !scene->is_editable_instance(canvas_item->get_owner()))) { + if (!canvas_item || !canvas_item->is_visible() || (canvas_item != scene && canvas_item->get_owner() != scene && canvas_item != scene->get_deepest_editable_node(canvas_item))) { return false; } @@ -5363,6 +5407,7 @@ void CanvasItemEditor::_bind_methods() { ClassDB::bind_method("_unhandled_key_input", &CanvasItemEditor::_unhandled_key_input); ClassDB::bind_method("_queue_update_bone_list", &CanvasItemEditor::_update_bone_list); ClassDB::bind_method("_update_bone_list", &CanvasItemEditor::_update_bone_list); + ClassDB::bind_method("_reset_create_position", &CanvasItemEditor::_reset_create_position); ClassDB::bind_method(D_METHOD("set_state"), &CanvasItemEditor::set_state); ClassDB::bind_method(D_METHOD("update_viewport"), &CanvasItemEditor::update_viewport); @@ -5684,6 +5729,9 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { editor_selection->connect("selection_changed", callable_mp((CanvasItem *)this, &CanvasItem::update)); editor_selection->connect("selection_changed", callable_mp(this, &CanvasItemEditor::_selection_changed)); + editor->get_scene_tree_dock()->connect("node_created", callable_mp(this, &CanvasItemEditor::_node_created)); + editor->get_scene_tree_dock()->connect("add_node_used", callable_mp(this, &CanvasItemEditor::_reset_create_position)); + editor->call_deferred("connect", "play_pressed", Callable(this, "_update_override_camera_button"), make_binds(true)); editor->call_deferred("connect", "stop_pressed", Callable(this, "_update_override_camera_button"), make_binds(false)); @@ -6105,6 +6153,12 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { selection_menu->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_selection_result_pressed)); selection_menu->connect("popup_hide", callable_mp(this, &CanvasItemEditor::_selection_menu_hide)); + add_node_menu = memnew(PopupMenu); + add_child(add_node_menu); + add_node_menu->add_icon_item(editor->get_scene_tree_dock()->get_theme_icon("Add", "EditorIcons"), TTR("Add Node Here")); + add_node_menu->add_icon_item(editor->get_scene_tree_dock()->get_theme_icon("Instance", "EditorIcons"), TTR("Instance Scene Here")); + add_node_menu->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_add_node_pressed)); + multiply_grid_step_shortcut = ED_SHORTCUT("canvas_item_editor/multiply_grid_step", TTR("Multiply grid step by 2"), KEY_KP_MULTIPLY); divide_grid_step_shortcut = ED_SHORTCUT("canvas_item_editor/divide_grid_step", TTR("Divide grid step by 2"), KEY_KP_DIVIDE); pan_view_shortcut = ED_SHORTCUT("canvas_item_editor/pan_view", TTR("Pan View"), KEY_SPACE); diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h index 24149a57b0..62a9b1e162 100644 --- a/editor/plugins/canvas_item_editor_plugin.h +++ b/editor/plugins/canvas_item_editor_plugin.h @@ -79,6 +79,11 @@ public: TOOL_MAX }; + enum AddNodeOption { + ADD_NODE, + ADD_INSTANCE, + }; + private: EditorNode *editor; @@ -284,6 +289,7 @@ private: bool ruler_tool_active; Point2 ruler_tool_origin; + Point2 node_create_position; MenuOption last_option; @@ -376,6 +382,7 @@ private: Button *key_auto_insert_button; PopupMenu *selection_menu; + PopupMenu *add_node_menu; Control *top_ruler; Control *left_ruler; @@ -436,6 +443,9 @@ private: void _snap_changed(); void _selection_result_pressed(int); void _selection_menu_hide(); + void _add_node_pressed(int p_result); + void _node_created(Node *p_node); + void _reset_create_position(); UndoRedo *undo_redo; bool _build_bones_list(Node *p_node); diff --git a/editor/plugins/collision_polygon_3d_editor_plugin.cpp b/editor/plugins/collision_polygon_3d_editor_plugin.cpp index 0c18975258..b50a497ccf 100644 --- a/editor/plugins/collision_polygon_3d_editor_plugin.cpp +++ b/editor/plugins/collision_polygon_3d_editor_plugin.cpp @@ -142,7 +142,7 @@ bool CollisionPolygon3DEditor::forward_spatial_gui_input(Camera3D *p_camera, con switch (mode) { case MODE_CREATE: { - if (mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed()) { if (!wip_active) { wip.clear(); wip.push_back(cpoint); @@ -166,14 +166,14 @@ bool CollisionPolygon3DEditor::forward_spatial_gui_input(Camera3D *p_camera, con return true; } } - } else if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed() && wip_active) { + } else if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed() && wip_active) { _wip_close(); } } break; case MODE_EDIT: { - if (mb->get_button_index() == BUTTON_LEFT) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->is_pressed()) { if (mb->get_control()) { if (poly.size() < 3) { @@ -267,7 +267,7 @@ bool CollisionPolygon3DEditor::forward_spatial_gui_input(Camera3D *p_camera, con } } } - if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed() && edited_point == -1) { + if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed() && edited_point == -1) { int closest_idx = -1; Vector2 closest_pos; real_t closest_dist = 1e10; @@ -301,7 +301,7 @@ bool CollisionPolygon3DEditor::forward_spatial_gui_input(Camera3D *p_camera, con Ref<InputEventMouseMotion> mm = p_event; if (mm.is_valid()) { - if (edited_point != -1 && (wip_active || mm->get_button_mask() & BUTTON_MASK_LEFT)) { + if (edited_point != -1 && (wip_active || mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT)) { Vector2 gpoint = mm->get_position(); Vector3 ray_from = p_camera->project_ray_origin(gpoint); diff --git a/editor/plugins/collision_shape_2d_editor_plugin.cpp b/editor/plugins/collision_shape_2d_editor_plugin.cpp index a1e7d3d6e0..c38458c37f 100644 --- a/editor/plugins/collision_shape_2d_editor_plugin.cpp +++ b/editor/plugins/collision_shape_2d_editor_plugin.cpp @@ -207,7 +207,7 @@ void CollisionShape2DEditor::set_handle(int idx, Point2 &p_point) { } break; } - node->get_shape()->_change_notify(); + node->get_shape()->notify_property_list_changed(); } void CollisionShape2DEditor::commit_handle(int idx, Variant &p_org) { @@ -325,7 +325,7 @@ bool CollisionShape2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_e if (mb.is_valid()) { Vector2 gpoint = mb->get_position(); - if (mb->get_button_index() == BUTTON_LEFT) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->is_pressed()) { for (int i = 0; i < handles.size(); i++) { if (xform.xform(handles[i]).distance_to(gpoint) < 8) { diff --git a/editor/plugins/curve_editor_plugin.cpp b/editor/plugins/curve_editor_plugin.cpp index bff5cb8d2a..db999f50ab 100644 --- a/editor/plugins/curve_editor_plugin.cpp +++ b/editor/plugins/curve_editor_plugin.cpp @@ -115,22 +115,22 @@ void CurveEditor::on_gui_input(const Ref<InputEvent> &p_event) { } switch (mb.get_button_index()) { - case BUTTON_RIGHT: + case MOUSE_BUTTON_RIGHT: _context_click_pos = mpos; open_context_menu(get_global_transform().xform(mpos)); break; - case BUTTON_MIDDLE: + case MOUSE_BUTTON_MIDDLE: remove_point(_hover_point); break; - case BUTTON_LEFT: + case MOUSE_BUTTON_LEFT: _dragging = true; break; } } - if (!mb.is_pressed() && _dragging && mb.get_button_index() == BUTTON_LEFT) { + if (!mb.is_pressed() && _dragging && mb.get_button_index() == MOUSE_BUTTON_LEFT) { _dragging = false; if (_has_undo_data) { UndoRedo &ur = *EditorNode::get_singleton()->get_undo_redo(); diff --git a/editor/plugins/editor_preview_plugins.cpp b/editor/plugins/editor_preview_plugins.cpp index 63bb785c5e..eb3c06fba1 100644 --- a/editor/plugins/editor_preview_plugins.cpp +++ b/editor/plugins/editor_preview_plugins.cpp @@ -301,7 +301,7 @@ EditorPackedScenePreviewPlugin::EditorPackedScenePreviewPlugin() { ////////////////////////////////////////////////////////////////// void EditorMaterialPreviewPlugin::_preview_done(const Variant &p_udata) { - preview_done = true; + preview_done.set(); } void EditorMaterialPreviewPlugin::_bind_methods() { @@ -325,10 +325,10 @@ Ref<Texture2D> EditorMaterialPreviewPlugin::generate(const RES &p_from, const Si RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_ONCE); //once used for capture - preview_done = false; + preview_done.clear(); RS::get_singleton()->request_frame_drawn_callback(const_cast<EditorMaterialPreviewPlugin *>(this), "_preview_done", Variant()); - while (!preview_done) { + while (!preview_done.is_set()) { OS::get_singleton()->delay_usec(10); } @@ -677,7 +677,7 @@ EditorAudioStreamPreviewPlugin::EditorAudioStreamPreviewPlugin() { /////////////////////////////////////////////////////////////////////////// void EditorMeshPreviewPlugin::_preview_done(const Variant &p_udata) { - preview_done = true; + preview_done.set(); } void EditorMeshPreviewPlugin::_bind_methods() { @@ -714,10 +714,10 @@ Ref<Texture2D> EditorMeshPreviewPlugin::generate(const RES &p_from, const Size2 RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_ONCE); //once used for capture - preview_done = false; + preview_done.clear(); RS::get_singleton()->request_frame_drawn_callback(const_cast<EditorMeshPreviewPlugin *>(this), "_preview_done", Variant()); - while (!preview_done) { + while (!preview_done.is_set()) { OS::get_singleton()->delay_usec(10); } @@ -792,7 +792,7 @@ EditorMeshPreviewPlugin::~EditorMeshPreviewPlugin() { /////////////////////////////////////////////////////////////////////////// void EditorFontPreviewPlugin::_preview_done(const Variant &p_udata) { - preview_done = true; + preview_done.set(); } void EditorFontPreviewPlugin::_bind_methods() { @@ -883,11 +883,11 @@ Ref<Texture2D> EditorFontPreviewPlugin::generate_from_path(const String &p_path, font->draw_string(canvas_item, pos, sample, HALIGN_LEFT, -1.f, 50, Color(1, 1, 1)); - preview_done = false; + preview_done.clear(); RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_ONCE); //once used for capture RS::get_singleton()->request_frame_drawn_callback(const_cast<EditorFontPreviewPlugin *>(this), "_preview_done", Variant()); - while (!preview_done) { + while (!preview_done.is_set()) { OS::get_singleton()->delay_usec(10); } diff --git a/editor/plugins/editor_preview_plugins.h b/editor/plugins/editor_preview_plugins.h index 57e2911c89..6e8b9a34cf 100644 --- a/editor/plugins/editor_preview_plugins.h +++ b/editor/plugins/editor_preview_plugins.h @@ -33,6 +33,8 @@ #include "editor/editor_resource_preview.h" +#include "core/templates/safe_refcount.h" + void post_process_preview(Ref<Image> p_image); class EditorTexturePreviewPlugin : public EditorResourcePreviewGenerator { @@ -90,7 +92,7 @@ class EditorMaterialPreviewPlugin : public EditorResourcePreviewGenerator { RID light2; RID light_instance2; RID camera; - mutable volatile bool preview_done = false; + mutable SafeFlag preview_done; void _preview_done(const Variant &p_udata); @@ -134,7 +136,7 @@ class EditorMeshPreviewPlugin : public EditorResourcePreviewGenerator { RID light2; RID light_instance2; RID camera; - mutable volatile bool preview_done = false; + mutable SafeFlag preview_done; void _preview_done(const Variant &p_udata); @@ -156,7 +158,7 @@ class EditorFontPreviewPlugin : public EditorResourcePreviewGenerator { RID viewport_texture; RID canvas; RID canvas_item; - mutable volatile bool preview_done = false; + mutable SafeFlag preview_done; void _preview_done(const Variant &p_udata); diff --git a/editor/plugins/gpu_particles_2d_editor_plugin.cpp b/editor/plugins/gpu_particles_2d_editor_plugin.cpp index 1aaa98d02e..b447304a3f 100644 --- a/editor/plugins/gpu_particles_2d_editor_plugin.cpp +++ b/editor/plugins/gpu_particles_2d_editor_plugin.cpp @@ -81,7 +81,7 @@ void GPUParticles2DEditorPlugin::_menu_callback(int p_idx) { cpu_particles->set_name(particles->get_name()); cpu_particles->set_transform(particles->get_transform()); cpu_particles->set_visible(particles->is_visible()); - cpu_particles->set_pause_mode(particles->get_pause_mode()); + cpu_particles->set_process_mode(particles->get_process_mode()); cpu_particles->set_z_index(particles->get_z_index()); UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); diff --git a/editor/plugins/gpu_particles_3d_editor_plugin.cpp b/editor/plugins/gpu_particles_3d_editor_plugin.cpp index 5b840ddbcf..433a5ae51c 100644 --- a/editor/plugins/gpu_particles_3d_editor_plugin.cpp +++ b/editor/plugins/gpu_particles_3d_editor_plugin.cpp @@ -263,7 +263,7 @@ void GPUParticles3DEditor::_menu_option(int p_option) { cpu_particles->set_name(node->get_name()); cpu_particles->set_transform(node->get_transform()); cpu_particles->set_visible(node->is_visible()); - cpu_particles->set_pause_mode(node->get_pause_mode()); + cpu_particles->set_process_mode(node->get_process_mode()); UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); ur->create_action(TTR("Convert to CPUParticles3D")); diff --git a/editor/plugins/item_list_editor_plugin.cpp b/editor/plugins/item_list_editor_plugin.cpp index c0f690bb6a..1ea6630622 100644 --- a/editor/plugins/item_list_editor_plugin.cpp +++ b/editor/plugins/item_list_editor_plugin.cpp @@ -145,7 +145,7 @@ int ItemListOptionButtonPlugin::get_flags() const { void ItemListOptionButtonPlugin::add_item() { ob->add_item(vformat(TTR("Item %d"), ob->get_item_count())); - _change_notify(); + notify_property_list_changed(); } int ItemListOptionButtonPlugin::get_item_count() const { @@ -154,7 +154,7 @@ int ItemListOptionButtonPlugin::get_item_count() const { void ItemListOptionButtonPlugin::erase(int p_idx) { ob->remove_item(p_idx); - _change_notify(); + notify_property_list_changed(); } ItemListOptionButtonPlugin::ItemListOptionButtonPlugin() { @@ -181,7 +181,7 @@ int ItemListPopupMenuPlugin::get_flags() const { void ItemListPopupMenuPlugin::add_item() { pp->add_item(vformat(TTR("Item %d"), pp->get_item_count())); - _change_notify(); + notify_property_list_changed(); } int ItemListPopupMenuPlugin::get_item_count() const { @@ -190,7 +190,7 @@ int ItemListPopupMenuPlugin::get_item_count() const { void ItemListPopupMenuPlugin::erase(int p_idx) { pp->remove_item(p_idx); - _change_notify(); + notify_property_list_changed(); } ItemListPopupMenuPlugin::ItemListPopupMenuPlugin() { @@ -213,7 +213,7 @@ int ItemListItemListPlugin::get_flags() const { void ItemListItemListPlugin::add_item() { pp->add_item(vformat(TTR("Item %d"), pp->get_item_count())); - _change_notify(); + notify_property_list_changed(); } int ItemListItemListPlugin::get_item_count() const { @@ -222,7 +222,7 @@ int ItemListItemListPlugin::get_item_count() const { void ItemListItemListPlugin::erase(int p_idx) { pp->remove_item(p_idx); - _change_notify(); + notify_property_list_changed(); } ItemListItemListPlugin::ItemListItemListPlugin() { diff --git a/editor/plugins/mesh_editor_plugin.cpp b/editor/plugins/mesh_editor_plugin.cpp index 1e4553a967..77719104b1 100644 --- a/editor/plugins/mesh_editor_plugin.cpp +++ b/editor/plugins/mesh_editor_plugin.cpp @@ -34,7 +34,7 @@ void MeshEditor::_gui_input(Ref<InputEvent> p_event) { Ref<InputEventMouseMotion> mm = p_event; - if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT) { + if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { rot_x -= mm->get_relative().y * 0.01; rot_y -= mm->get_relative().x * 0.01; if (rot_x < -Math_PI / 2) { diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index a3009731f9..fccc042a02 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -48,6 +48,7 @@ #include "scene/3d/mesh_instance_3d.h" #include "scene/3d/physics_body_3d.h" #include "scene/3d/visual_instance_3d.h" +#include "scene/gui/center_container.h" #include "scene/gui/subviewport_container.h" #include "scene/resources/packed_scene.h" #include "scene/resources/surface_tool.h" @@ -185,7 +186,7 @@ void ViewportRotationControl::_get_sorted_axis(Vector<Axis2D> &r_axis) { void ViewportRotationControl::_gui_input(Ref<InputEvent> p_event) { const Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { Vector2 pos = mb->get_position(); if (mb->is_pressed()) { if (pos.distance_to(get_size() / 2.0) < get_size().x / 2.0) { @@ -535,8 +536,8 @@ ObjectID Node3DEditorViewport::_select_ray(const Point2 &p_pos, bool p_append, b if (dist < closest_dist) { item = Object::cast_to<Node>(spat); - while (item->get_owner() && item->get_owner() != edited_scene && !edited_scene->is_editable_instance(item->get_owner())) { - item = item->get_owner(); + if (item != edited_scene) { + item = edited_scene->get_deepest_editable_node(item); } closest = item->get_instance_id(); @@ -697,8 +698,8 @@ void Node3DEditorViewport::_select_region() { } Node *item = Object::cast_to<Node>(sp); - while (item->get_owner() && item->get_owner() != edited_scene && !edited_scene->is_editable_instance(item->get_owner())) { - item = item->get_owner(); + if (item != edited_scene) { + item = edited_scene->get_deepest_editable_node(item); } // Replace the node by the group if grouped @@ -1027,7 +1028,7 @@ void Node3DEditorViewport::_list_select(Ref<InputEventMouseButton> b) { for (int i = 0; i < selection_results.size(); i++) { Node3D *item = selection_results[i].item; - if (item != scene && item->get_owner() != scene && !scene->is_editable_instance(item->get_owner())) { + if (item != scene && item->get_owner() != scene && item != scene->get_deepest_editable_node(item)) { //invalid result selection_results.remove(i); i--; @@ -1122,23 +1123,21 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { float zoom_factor = 1 + (ZOOM_FREELOOK_MULTIPLIER - 1) * b->get_factor(); switch (b->get_button_index()) { - case BUTTON_WHEEL_UP: { + case MOUSE_BUTTON_WHEEL_UP: { if (is_freelook_active()) { scale_freelook_speed(zoom_factor); } else { scale_cursor_distance(1.0 / zoom_factor); } } break; - - case BUTTON_WHEEL_DOWN: { + case MOUSE_BUTTON_WHEEL_DOWN: { if (is_freelook_active()) { scale_freelook_speed(1.0 / zoom_factor); } else { scale_cursor_distance(zoom_factor); } } break; - - case BUTTON_RIGHT: { + case MOUSE_BUTTON_RIGHT: { NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int(); if (b->is_pressed() && _edit.gizmo.is_valid()) { @@ -1199,7 +1198,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } } break; - case BUTTON_MIDDLE: { + case MOUSE_BUTTON_MIDDLE: { if (b->is_pressed() && _edit.mode != TRANSFORM_NONE) { switch (_edit.plane) { case TRANSFORM_VIEW: { @@ -1230,7 +1229,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } } } break; - case BUTTON_LEFT: { + case MOUSE_BUTTON_LEFT: { if (b->is_pressed()) { NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int(); if ((nav_scheme == NAVIGATION_MAYA || nav_scheme == NAVIGATION_MODO) && b->get_alt()) { @@ -1439,7 +1438,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { String n = _edit.gizmo->get_handle_name(_edit.gizmo_handle); set_message(n + ": " + String(v)); - } else if (m->get_button_mask() & BUTTON_MASK_LEFT) { + } else if (m->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { if (nav_scheme == NAVIGATION_MAYA && m->get_alt()) { nav_mode = NAVIGATION_ORBIT; } else if (nav_scheme == NAVIGATION_MODO && m->get_alt() && m->get_shift()) { @@ -1829,8 +1828,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } } } - - } else if ((m->get_button_mask() & BUTTON_MASK_RIGHT) || freelook_active) { + } else if ((m->get_button_mask() & MOUSE_BUTTON_MASK_RIGHT) || freelook_active) { if (nav_scheme == NAVIGATION_MAYA && m->get_alt()) { nav_mode = NAVIGATION_ZOOM; } else if (freelook_active) { @@ -1839,10 +1837,9 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { nav_mode = NAVIGATION_PAN; } - } else if (m->get_button_mask() & BUTTON_MASK_MIDDLE) { + } else if (m->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE) { + const int mod = _get_key_modifier(m); if (nav_scheme == NAVIGATION_GODOT) { - const int mod = _get_key_modifier(m); - if (mod == _get_key_modifier_setting("editors/3d/navigation/pan_modifier")) { nav_mode = NAVIGATION_PAN; } else if (mod == _get_key_modifier_setting("editors/3d/navigation/zoom_modifier")) { @@ -1851,13 +1848,11 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { // Always allow Alt as a modifier to better support graphic tablets. nav_mode = NAVIGATION_ORBIT; } - } else if (nav_scheme == NAVIGATION_MAYA) { - if (m->get_alt()) { + if (mod == _get_key_modifier_setting("editors/3d/navigation/pan_modifier")) { nav_mode = NAVIGATION_PAN; } } - } else if (EditorSettings::get_singleton()->get("editors/3d/navigation/emulate_3_button_mouse")) { // Handle trackpad (no external mouse) use case const int mod = _get_key_modifier(m); @@ -2335,7 +2330,43 @@ void Node3DEditorPlugin::edited_scene_changed() { } } +void Node3DEditorViewport::_project_settings_changed() { + //update shadow atlas if changed + int shadowmap_size = ProjectSettings::get_singleton()->get("rendering/shadows/shadow_atlas/size"); + bool shadowmap_16_bits = ProjectSettings::get_singleton()->get("rendering/shadows/shadow_atlas/16_bits"); + int atlas_q0 = ProjectSettings::get_singleton()->get("rendering/shadows/shadow_atlas/quadrant_0_subdiv"); + int atlas_q1 = ProjectSettings::get_singleton()->get("rendering/shadows/shadow_atlas/quadrant_1_subdiv"); + int atlas_q2 = ProjectSettings::get_singleton()->get("rendering/shadows/shadow_atlas/quadrant_2_subdiv"); + int atlas_q3 = ProjectSettings::get_singleton()->get("rendering/shadows/shadow_atlas/quadrant_3_subdiv"); + + viewport->set_shadow_atlas_size(shadowmap_size); + viewport->set_shadow_atlas_16_bits(shadowmap_16_bits); + viewport->set_shadow_atlas_quadrant_subdiv(0, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q0)); + viewport->set_shadow_atlas_quadrant_subdiv(1, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q1)); + viewport->set_shadow_atlas_quadrant_subdiv(2, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q2)); + viewport->set_shadow_atlas_quadrant_subdiv(3, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q3)); + + bool shrink = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_HALF_RESOLUTION)); + + if (shrink != (subviewport_container->get_stretch_shrink() > 1)) { + subviewport_container->set_stretch_shrink(shrink ? 2 : 1); + } + + // Update MSAA, screen-space AA and debanding if changed + + const int msaa_mode = ProjectSettings::get_singleton()->get("rendering/anti_aliasing/quality/msaa"); + viewport->set_msaa(Viewport::MSAA(msaa_mode)); + const int ssaa_mode = GLOBAL_GET("rendering/anti_aliasing/quality/screen_space_aa"); + viewport->set_screen_space_aa(Viewport::ScreenSpaceAA(ssaa_mode)); + const bool use_debanding = GLOBAL_GET("rendering/anti_aliasing/quality/use_debanding"); + viewport->set_use_debanding(use_debanding); +} + void Node3DEditorViewport::_notification(int p_what) { + if (p_what == NOTIFICATION_READY) { + EditorNode::get_singleton()->connect("project_settings_changed", callable_mp(this, &Node3DEditorViewport::_project_settings_changed)); + } + if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { bool visible = is_visible_in_tree(); @@ -2442,37 +2473,6 @@ void Node3DEditorViewport::_notification(int p_what) { } } - //update shadow atlas if changed - - int shadowmap_size = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/size"); - bool shadowmap_16_bits = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/16_bits"); - int atlas_q0 = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/quadrant_0_subdiv"); - int atlas_q1 = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/quadrant_1_subdiv"); - int atlas_q2 = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/quadrant_2_subdiv"); - int atlas_q3 = ProjectSettings::get_singleton()->get("rendering/quality/shadow_atlas/quadrant_3_subdiv"); - - viewport->set_shadow_atlas_size(shadowmap_size); - viewport->set_shadow_atlas_16_bits(shadowmap_16_bits); - viewport->set_shadow_atlas_quadrant_subdiv(0, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q0)); - viewport->set_shadow_atlas_quadrant_subdiv(1, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q1)); - viewport->set_shadow_atlas_quadrant_subdiv(2, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q2)); - viewport->set_shadow_atlas_quadrant_subdiv(3, Viewport::ShadowAtlasQuadrantSubdiv(atlas_q3)); - - bool shrink = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_HALF_RESOLUTION)); - - if (shrink != (subviewport_container->get_stretch_shrink() > 1)) { - subviewport_container->set_stretch_shrink(shrink ? 2 : 1); - } - - // Update MSAA, screen-space AA and debanding if changed - - const int msaa_mode = ProjectSettings::get_singleton()->get("rendering/quality/screen_filters/msaa"); - viewport->set_msaa(Viewport::MSAA(msaa_mode)); - const int ssaa_mode = GLOBAL_GET("rendering/quality/screen_filters/screen_space_aa"); - viewport->set_screen_space_aa(Viewport::ScreenSpaceAA(ssaa_mode)); - const bool use_debanding = GLOBAL_GET("rendering/quality/screen_filters/use_debanding"); - viewport->set_use_debanding(use_debanding); - bool show_info = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_INFORMATION)); if (show_info != info_label->is_visible()) { info_label->set_visible(show_info); @@ -4194,7 +4194,7 @@ Node3DEditorViewport::~Node3DEditorViewport() { void Node3DEditorViewportContainer::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->is_pressed()) { Vector2 size = get_size(); @@ -4707,11 +4707,33 @@ Dictionary Node3DEditor::get_state() const { continue; } int state = gizmos_menu->get_item_state(gizmos_menu->get_item_index(i)); - String name = gizmo_plugins_by_name[i]->get_name(); + String name = gizmo_plugins_by_name[i]->get_gizmo_name(); gizmos_status[name] = state; } d["gizmos_status"] = gizmos_status; + { + Dictionary pd; + + pd["sun_rotation"] = sun_rotation; + + pd["environ_sky_color"] = environ_sky_color->get_pick_color(); + pd["environ_ground_color"] = environ_ground_color->get_pick_color(); + pd["environ_energy"] = environ_energy->get_value(); + pd["environ_glow_enabled"] = environ_glow_button->is_pressed(); + pd["environ_tonemap_enabled"] = environ_tonemap_button->is_pressed(); + pd["environ_ao_enabled"] = environ_ao_button->is_pressed(); + pd["environ_gi_enabled"] = environ_gi_button->is_pressed(); + pd["sun_max_distance"] = sun_max_distance->get_value(); + + pd["sun_color"] = sun_color->get_pick_color(); + pd["sun_energy"] = sun_energy->get_value(); + + pd["sun_disabled"] = sun_button->is_pressed(); + pd["environ_disabled"] = environ_button->is_pressed(); + + d["preview_sun_env"] = pd; + } return d; } @@ -4811,7 +4833,7 @@ void Node3DEditor::set_state(const Dictionary &p_state) { } int state = EditorNode3DGizmoPlugin::VISIBLE; for (int i = 0; i < keys.size(); i++) { - if (gizmo_plugins_by_name.write[j]->get_name() == String(keys[i])) { + if (gizmo_plugins_by_name.write[j]->get_gizmo_name() == String(keys[i])) { state = gizmos_status[keys[i]]; break; } @@ -4821,6 +4843,38 @@ void Node3DEditor::set_state(const Dictionary &p_state) { } _update_gizmos_menu(); } + + if (d.has("preview_sun_env")) { + sun_environ_updating = true; + Dictionary pd = d["preview_sun_env"]; + sun_rotation = pd["sun_rotation"]; + + environ_sky_color->set_pick_color(pd["environ_sky_color"]); + environ_ground_color->set_pick_color(pd["environ_ground_color"]); + environ_energy->set_value(pd["environ_energy"]); + environ_glow_button->set_pressed(pd["environ_glow_enabled"]); + environ_tonemap_button->set_pressed(pd["environ_tonemap_enabled"]); + environ_ao_button->set_pressed(pd["environ_ao_enabled"]); + environ_gi_button->set_pressed(pd["environ_gi_enabled"]); + sun_max_distance->set_value(pd["sun_max_distance"]); + + sun_color->set_pick_color(pd["sun_color"]); + sun_energy->set_value(pd["sun_energy"]); + + sun_button->set_pressed(pd["sun_disabled"]); + environ_button->set_pressed(pd["environ_disabled"]); + + sun_environ_updating = false; + + _preview_settings_changed(); + _update_preview_environment(); + } else { + _load_default_preview_settings(); + sun_button->set_pressed(false); + environ_button->set_pressed(false); + _preview_settings_changed(); + _update_preview_environment(); + } } void Node3DEditor::edit(Node3D *p_spatial) { @@ -5690,7 +5744,7 @@ void Node3DEditor::_update_gizmos_menu() { if (!gizmo_plugins_by_name[i]->can_be_hidden()) { continue; } - String plugin_name = gizmo_plugins_by_name[i]->get_name(); + String plugin_name = gizmo_plugins_by_name[i]->get_gizmo_name(); const int plugin_state = gizmo_plugins_by_name[i]->get_state(); gizmos_menu->add_multistate_item(plugin_name, 3, plugin_state, i); const int idx = gizmos_menu->get_item_index(i); @@ -5761,7 +5815,7 @@ void Node3DEditor::_init_grid() { // Offsets division_level for bigger or smaller grids. // Default value is -0.2. -1.0 gives Blender-like behavior, 0.5 gives huge grids. real_t division_level_bias = EditorSettings::get_singleton()->get("editors/3d/grid_division_level_bias"); - // Default largest grid size is 100m, 10^2 (default value is 2). + // Default largest grid size is 8^2 when primary_grid_steps is 8 (64m apart, so primary grid lines are 512m apart). int division_level_max = EditorSettings::get_singleton()->get("editors/3d/grid_division_level_max"); // Default smallest grid size is 1cm, 10^-2 (default value is -2). int division_level_min = EditorSettings::get_singleton()->get("editors/3d/grid_division_level_min"); @@ -6107,6 +6161,51 @@ void Node3DEditor::_unhandled_key_input(Ref<InputEvent> p_event) { snap_key_enabled = Input::get_singleton()->is_key_pressed(KEY_CONTROL); } +void Node3DEditor::_sun_environ_settings_pressed() { + Vector2 pos = sun_environ_settings->get_screen_position() + sun_environ_settings->get_size(); + sun_environ_popup->set_position(pos - Vector2(sun_environ_popup->get_contents_minimum_size().width / 2, 0)); + sun_environ_popup->popup(); +} + +void Node3DEditor::_add_sun_to_scene() { + sun_environ_popup->hide(); + + Node *base = get_tree()->get_edited_scene_root(); + if (!base) { + EditorNode::get_singleton()->show_warning(TTR("A root node is needed for this operation")); + return; + } + ERR_FAIL_COND(!base); + Node *new_sun = preview_sun->duplicate(); + + undo_redo->create_action("Add Preview Sun to Scene"); + undo_redo->add_do_method(base, "add_child", new_sun); + undo_redo->add_do_method(new_sun, "set_owner", base); + undo_redo->add_undo_method(base, "remove_child", new_sun); + undo_redo->add_do_reference(new_sun); + undo_redo->commit_action(); +} +void Node3DEditor::_add_environment_to_scene() { + sun_environ_popup->hide(); + + Node *base = get_tree()->get_edited_scene_root(); + if (!base) { + EditorNode::get_singleton()->show_warning(TTR("A root node is needed for this operation")); + return; + } + ERR_FAIL_COND(!base); + + WorldEnvironment *new_env = memnew(WorldEnvironment); + new_env->set_environment(preview_environment->get_environment()->duplicate(true)); + + undo_redo->create_action("Add Preview Environment to Scene"); + undo_redo->add_do_method(base, "add_child", new_env); + undo_redo->add_do_method(new_env, "set_owner", base); + undo_redo->add_undo_method(base, "remove_child", new_env); + undo_redo->add_do_reference(new_env); + undo_redo->commit_action(); +} + void Node3DEditor::_notification(int p_what) { if (p_what == NOTIFICATION_READY) { tool_button[Node3DEditor::TOOL_MODE_SELECT]->set_icon(get_theme_icon("ToolSelect", "EditorIcons")); @@ -6135,17 +6234,31 @@ void Node3DEditor::_notification(int p_what) { _refresh_menu_icons(); get_tree()->connect("node_removed", callable_mp(this, &Node3DEditor::_node_removed)); + get_tree()->connect("node_added", callable_mp(this, &Node3DEditor::_node_added)); EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor()->connect("node_changed", callable_mp(this, &Node3DEditor::_refresh_menu_icons)); editor_selection->connect("selection_changed", callable_mp(this, &Node3DEditor::_refresh_menu_icons)); editor->connect("stop_pressed", callable_mp(this, &Node3DEditor::_update_camera_override_button), make_binds(false)); editor->connect("play_pressed", callable_mp(this, &Node3DEditor::_update_camera_override_button), make_binds(true)); + + sun_button->set_icon(get_theme_icon("DirectionalLight3D", "EditorIcons")); + environ_button->set_icon(get_theme_icon("WorldEnvironment", "EditorIcons")); + sun_environ_settings->set_icon(get_theme_icon("GuiTabMenuHl", "EditorIcons")); + + _update_preview_environment(); + sun_title->add_theme_font_override("font", get_theme_font("title_font", "Window")); + environ_title->add_theme_font_override("font", get_theme_font("title_font", "Window")); + + sun_state->set_custom_minimum_size(sun_vb->get_combined_minimum_size()); + environ_state->set_custom_minimum_size(environ_vb->get_combined_minimum_size()); } else if (p_what == NOTIFICATION_ENTER_TREE) { _register_all_gizmos(); _update_gizmos_menu(); _init_indicators(); } else if (p_what == NOTIFICATION_THEME_CHANGED) { _update_gizmos_menu_theme(); + sun_title->add_theme_font_override("font", get_theme_font("title_font", "Window")); + environ_title->add_theme_font_override("font", get_theme_font("title_font", "Window")); } else if (p_what == NOTIFICATION_EXIT_TREE) { _finish_indicators(); } else if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) { @@ -6282,7 +6395,37 @@ void Node3DEditor::_toggle_maximize_view(Object *p_viewport) { } } +void Node3DEditor::_node_added(Node *p_node) { + if (EditorNode::get_singleton()->get_scene_root()->is_a_parent_of(p_node)) { + if (Object::cast_to<WorldEnvironment>(p_node)) { + world_env_count++; + if (world_env_count == 1) { + _update_preview_environment(); + } + } else if (Object::cast_to<DirectionalLight3D>(p_node)) { + directional_light_count++; + if (directional_light_count == 1) { + _update_preview_environment(); + } + } + } +} + void Node3DEditor::_node_removed(Node *p_node) { + if (EditorNode::get_singleton()->get_scene_root()->is_a_parent_of(p_node)) { + if (Object::cast_to<WorldEnvironment>(p_node)) { + world_env_count--; + if (world_env_count == 0) { + _update_preview_environment(); + } + } else if (Object::cast_to<DirectionalLight3D>(p_node)) { + directional_light_count--; + if (directional_light_count == 0) { + _update_preview_environment(); + } + } + } + if (p_node == selected) { selected = nullptr; } @@ -6309,6 +6452,7 @@ void Node3DEditor::_register_all_gizmos() { add_gizmo_plugin(Ref<GIProbeGizmoPlugin>(memnew(GIProbeGizmoPlugin))); add_gizmo_plugin(Ref<BakedLightmapGizmoPlugin>(memnew(BakedLightmapGizmoPlugin))); add_gizmo_plugin(Ref<LightmapProbeGizmoPlugin>(memnew(LightmapProbeGizmoPlugin))); + add_gizmo_plugin(Ref<CollisionObject3DGizmoPlugin>(memnew(CollisionObject3DGizmoPlugin))); add_gizmo_plugin(Ref<CollisionShape3DGizmoPlugin>(memnew(CollisionShape3DGizmoPlugin))); add_gizmo_plugin(Ref<CollisionPolygon3DGizmoPlugin>(memnew(CollisionPolygon3DGizmoPlugin))); add_gizmo_plugin(Ref<NavigationRegion3DGizmoPlugin>(memnew(NavigationRegion3DGizmoPlugin))); @@ -6352,6 +6496,128 @@ void Node3DEditor::clear() { view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_GRID), true); } +void Node3DEditor::_sun_direction_draw() { + sun_direction->draw_rect(Rect2(Vector2(), sun_direction->get_size()), Color(1, 1, 1, 1)); + sun_direction_material->set_shader_param("sun_direction", -preview_sun->get_transform().basis.get_axis(Vector3::AXIS_Z)); + float nrg = sun_energy->get_value(); + sun_direction_material->set_shader_param("sun_color", Vector3(sun_color->get_pick_color().r * nrg, sun_color->get_pick_color().g * nrg, sun_color->get_pick_color().b * nrg)); +} + +void Node3DEditor::_preview_settings_changed() { + if (sun_environ_updating) { + return; + } + + { // preview sun + Transform t; + t.basis = sun_rotation; + preview_sun->set_transform(t); + sun_direction->update(); + preview_sun->set_param(Light3D::PARAM_ENERGY, sun_energy->get_value()); + preview_sun->set_param(Light3D::PARAM_SHADOW_MAX_DISTANCE, sun_max_distance->get_value()); + preview_sun->set_color(sun_color->get_pick_color()); + } + + { //preview env + sky_material->set_sky_energy(environ_energy->get_value()); + Color hz_color = environ_sky_color->get_pick_color().lerp(environ_ground_color->get_pick_color(), 0.5).lerp(Color(1, 1, 1), 0.5); + sky_material->set_sky_top_color(environ_sky_color->get_pick_color()); + sky_material->set_sky_horizon_color(hz_color); + sky_material->set_ground_bottom_color(environ_ground_color->get_pick_color()); + sky_material->set_ground_horizon_color(hz_color); + + environment->set_ssao_enabled(environ_ao_button->is_pressed()); + environment->set_glow_enabled(environ_glow_button->is_pressed()); + environment->set_sdfgi_enabled(environ_gi_button->is_pressed()); + environment->set_tonemapper(environ_tonemap_button->is_pressed() ? Environment::TONE_MAPPER_FILMIC : Environment::TONE_MAPPER_LINEAR); + } +} +void Node3DEditor::_load_default_preview_settings() { + sun_environ_updating = true; + + sun_rotation = Basis(Vector3(0, 1, 0), Math_PI * 3.0 / 4) * Basis(Vector3(1, 0, 0), -Math_PI / 4); + + sun_direction->update(); + environ_sky_color->set_pick_color(Color::hex(0x91b2ceff)); + environ_ground_color->set_pick_color(Color::hex(0x1f1f21ff)); + environ_energy->set_value(1.0); + environ_glow_button->set_pressed(true); + environ_tonemap_button->set_pressed(true); + environ_ao_button->set_pressed(false); + environ_gi_button->set_pressed(false); + sun_max_distance->set_value(250); + + sun_color->set_pick_color(Color(1, 1, 1)); + sun_energy->set_value(1.0); + + sun_environ_updating = false; +} + +void Node3DEditor::_update_preview_environment() { + bool disable_light = directional_light_count > 0 || sun_button->is_pressed(); + + sun_button->set_disabled(directional_light_count > 0); + + if (disable_light) { + if (preview_sun->get_parent()) { + preview_sun->get_parent()->remove_child(preview_sun); + sun_state->show(); + sun_vb->hide(); + } + + if (directional_light_count > 0) { + sun_state->set_text(TTR("Scene contains\nDirectionalLight3D.\nPreview disabled.")); + } else { + sun_state->set_text(TTR("Preview disabled.")); + } + + } else { + if (!preview_sun->get_parent()) { + add_child(preview_sun); + sun_state->hide(); + sun_vb->show(); + } + } + + bool disable_env = world_env_count > 0 || environ_button->is_pressed(); + + environ_button->set_disabled(world_env_count > 0); + + if (disable_env) { + if (preview_environment->get_parent()) { + preview_environment->get_parent()->remove_child(preview_environment); + environ_state->show(); + environ_vb->hide(); + } + if (world_env_count > 0) { + environ_state->set_text(TTR("Scene contains\nWorldEnvironment.\nPreview disabled.")); + } else { + environ_state->set_text(TTR("Preview disabled.")); + } + + } else { + if (!preview_environment->get_parent()) { + add_child(preview_environment); + environ_state->hide(); + environ_vb->show(); + } + } +} + +void Node3DEditor::_sun_direction_input(const Ref<InputEvent> &p_event) { + Ref<InputEventMouseMotion> mm = p_event; + if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { + float x = -mm->get_relative().y * 0.02 * EDSCALE; + float y = mm->get_relative().x * 0.02 * EDSCALE; + + Basis rot = Basis(Vector3(0, 1, 0), y) * Basis(Vector3(1, 0, 0), x); + + sun_rotation = rot * sun_rotation; + sun_rotation.orthonormalize(); + _preview_settings_changed(); + } +} + Node3DEditor::Node3DEditor(EditorNode *p_editor) { gizmo.visible = true; gizmo.scale = 1.0; @@ -6489,6 +6755,32 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { _update_camera_override_button(false); hbc_menu->add_child(memnew(VSeparator)); + sun_button = memnew(Button); + sun_button->set_tooltip(TTR("Toggle preview sunlight.\nIf a DirectionalLight3D node is added to the scene, preview sunlight is disabled.")); + sun_button->set_toggle_mode(true); + sun_button->set_flat(true); + sun_button->connect("pressed", callable_mp(this, &Node3DEditor::_update_preview_environment), varray(), CONNECT_DEFERRED); + sun_button->set_disabled(true); + + hbc_menu->add_child(sun_button); + + environ_button = memnew(Button); + environ_button->set_tooltip(TTR("Toggle preview environment.\nIf a WorldEnvironment node is added to the scene, preview environment is disabled.")); + environ_button->set_toggle_mode(true); + environ_button->set_flat(true); + environ_button->connect("pressed", callable_mp(this, &Node3DEditor::_update_preview_environment), varray(), CONNECT_DEFERRED); + environ_button->set_disabled(true); + + hbc_menu->add_child(environ_button); + + sun_environ_settings = memnew(Button); + sun_environ_settings->set_tooltip(TTR("Edit Sun and Environment settings.")); + sun_environ_settings->set_flat(true); + sun_environ_settings->connect("pressed", callable_mp(this, &Node3DEditor::_sun_environ_settings_pressed)); + + hbc_menu->add_child(sun_environ_settings); + + hbc_menu->add_child(memnew(VSeparator)); // Drag and drop support; preview_node = memnew(Node3D); @@ -6718,6 +7010,152 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { EDITOR_DEF("editors/3d/navigation/show_viewport_rotation_gizmo", true); over_gizmo_handle = -1; + { + //sun popup + + sun_environ_popup = memnew(PopupPanel); + add_child(sun_environ_popup); + + HBoxContainer *sun_environ_hb = memnew(HBoxContainer); + + sun_environ_popup->add_child(sun_environ_hb); + + sun_vb = memnew(VBoxContainer); + sun_environ_hb->add_child(sun_vb); + sun_vb->set_custom_minimum_size(Size2(200 * EDSCALE, 0)); + sun_vb->hide(); + + sun_title = memnew(Label); + sun_vb->add_child(sun_title); + sun_title->set_text(TTR("Preview Sun")); + sun_title->set_align(Label::ALIGN_CENTER); + + CenterContainer *sun_direction_center = memnew(CenterContainer); + sun_direction = memnew(Control); + sun_direction->set_custom_minimum_size(Size2i(128, 128) * EDSCALE); + sun_direction_center->add_child(sun_direction); + sun_vb->add_margin_child(TTR("Sun Direction"), sun_direction_center); + sun_direction->connect("gui_input", callable_mp(this, &Node3DEditor::_sun_direction_input)); + sun_direction->connect("draw", callable_mp(this, &Node3DEditor::_sun_direction_draw)); + sun_direction->set_default_cursor_shape(CURSOR_MOVE); + + String sun_dir_shader_code = "shader_type canvas_item; uniform vec3 sun_direction; uniform vec3 sun_color; void fragment() { vec3 n; n.xy = UV * 2.0 - 1.0; n.z = sqrt(max(0.0, 1.0 - dot(n.xy, n.xy))); COLOR.rgb = dot(n,sun_direction) * sun_color; COLOR.a = 1.0 - smoothstep(0.99,1.0,length(n.xy)); }"; + sun_direction_shader.instance(); + sun_direction_shader->set_code(sun_dir_shader_code); + sun_direction_material.instance(); + sun_direction_material->set_shader(sun_direction_shader); + sun_direction_material->set_shader_param("sun_direction", Vector3(0, 0, 1)); + sun_direction_material->set_shader_param("sun_color", Vector3(1, 1, 1)); + sun_direction->set_material(sun_direction_material); + + sun_color = memnew(ColorPickerButton); + sun_color->set_edit_alpha(false); + sun_vb->add_margin_child(TTR("Sun Color"), sun_color); + sun_color->connect("color_changed", callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); + + sun_energy = memnew(EditorSpinSlider); + sun_vb->add_margin_child(TTR("Sun Energy"), sun_energy); + sun_energy->connect("value_changed", callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); + sun_energy->set_max(64.0); + + sun_max_distance = memnew(EditorSpinSlider); + sun_vb->add_margin_child(TTR("Shadow Max Distance"), sun_max_distance); + sun_max_distance->connect("value_changed", callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); + sun_max_distance->set_min(1); + sun_max_distance->set_max(4096); + + sun_add_to_scene = memnew(Button); + sun_add_to_scene->set_text(TTR("Add Sun to Scene")); + sun_add_to_scene->connect("pressed", callable_mp(this, &Node3DEditor::_add_sun_to_scene)); + sun_vb->add_spacer(); + sun_vb->add_child(sun_add_to_scene); + + sun_state = memnew(Label); + sun_environ_hb->add_child(sun_state); + sun_state->set_align(Label::ALIGN_CENTER); + sun_state->set_valign(Label::VALIGN_CENTER); + sun_state->set_h_size_flags(SIZE_EXPAND_FILL); + + VSeparator *sc = memnew(VSeparator); + sc->set_custom_minimum_size(Size2(50 * EDSCALE, 0)); + sc->set_v_size_flags(SIZE_EXPAND_FILL); + sun_environ_hb->add_child(sc); + + environ_vb = memnew(VBoxContainer); + sun_environ_hb->add_child(environ_vb); + environ_vb->set_custom_minimum_size(Size2(200 * EDSCALE, 0)); + environ_vb->hide(); + + environ_title = memnew(Label); + environ_vb->add_child(environ_title); + environ_title->set_text(TTR("Preview Environment")); + environ_title->set_align(Label::ALIGN_CENTER); + + environ_sky_color = memnew(ColorPickerButton); + environ_sky_color->set_edit_alpha(false); + environ_sky_color->connect("color_changed", callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); + environ_vb->add_margin_child(TTR("Sky Color"), environ_sky_color); + environ_ground_color = memnew(ColorPickerButton); + environ_ground_color->connect("color_changed", callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); + environ_ground_color->set_edit_alpha(false); + environ_vb->add_margin_child(TTR("Ground Color"), environ_ground_color); + environ_energy = memnew(EditorSpinSlider); + environ_energy->connect("value_changed", callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); + environ_energy->set_max(8.0); + environ_vb->add_margin_child(TTR("Sky Energy"), environ_energy); + HBoxContainer *fx_vb = memnew(HBoxContainer); + fx_vb->set_h_size_flags(SIZE_EXPAND_FILL); + + environ_ao_button = memnew(Button); + environ_ao_button->set_text(TTR("AO")); + environ_ao_button->set_toggle_mode(true); + environ_ao_button->connect("pressed", callable_mp(this, &Node3DEditor::_preview_settings_changed), varray(), CONNECT_DEFERRED); + fx_vb->add_child(environ_ao_button); + environ_glow_button = memnew(Button); + environ_glow_button->set_text(TTR("Glow")); + environ_glow_button->set_toggle_mode(true); + environ_glow_button->connect("pressed", callable_mp(this, &Node3DEditor::_preview_settings_changed), varray(), CONNECT_DEFERRED); + fx_vb->add_child(environ_glow_button); + environ_tonemap_button = memnew(Button); + environ_tonemap_button->set_text(TTR("Tonemap")); + environ_tonemap_button->set_toggle_mode(true); + environ_tonemap_button->connect("pressed", callable_mp(this, &Node3DEditor::_preview_settings_changed), varray(), CONNECT_DEFERRED); + fx_vb->add_child(environ_tonemap_button); + environ_gi_button = memnew(Button); + environ_gi_button->set_text(TTR("GI")); + environ_gi_button->set_toggle_mode(true); + environ_gi_button->connect("pressed", callable_mp(this, &Node3DEditor::_preview_settings_changed), varray(), CONNECT_DEFERRED); + fx_vb->add_child(environ_gi_button); + environ_vb->add_margin_child(TTR("Post Process"), fx_vb); + + environ_add_to_scene = memnew(Button); + environ_add_to_scene->set_text(TTR("Add Environment to Scene")); + environ_add_to_scene->connect("pressed", callable_mp(this, &Node3DEditor::_add_environment_to_scene)); + environ_vb->add_spacer(); + environ_vb->add_child(environ_add_to_scene); + + environ_state = memnew(Label); + sun_environ_hb->add_child(environ_state); + environ_state->set_align(Label::ALIGN_CENTER); + environ_state->set_valign(Label::VALIGN_CENTER); + environ_state->set_h_size_flags(SIZE_EXPAND_FILL); + + preview_sun = memnew(DirectionalLight3D); + preview_sun->set_shadow(true); + preview_sun->set_shadow_mode(DirectionalLight3D::SHADOW_PARALLEL_4_SPLITS); + preview_environment = memnew(WorldEnvironment); + environment.instance(); + preview_environment->set_environment(environment); + Ref<Sky> sky; + sky.instance(); + sky_material.instance(); + sky->set_material(sky_material); + environment->set_sky(sky); + environment->set_background(Environment::BG_SKY); + + _load_default_preview_settings(); + _preview_settings_changed(); + } } Node3DEditor::~Node3DEditor() { @@ -6808,7 +7246,7 @@ void Node3DEditorPlugin::snap_cursor_to_plane(const Plane &p_plane) { struct _GizmoPluginPriorityComparator { bool operator()(const Ref<EditorNode3DGizmoPlugin> &p_a, const Ref<EditorNode3DGizmoPlugin> &p_b) const { if (p_a->get_priority() == p_b->get_priority()) { - return p_a->get_name() < p_b->get_name(); + return p_a->get_gizmo_name() < p_b->get_gizmo_name(); } return p_a->get_priority() > p_b->get_priority(); } @@ -6816,7 +7254,7 @@ struct _GizmoPluginPriorityComparator { struct _GizmoPluginNameComparator { bool operator()(const Ref<EditorNode3DGizmoPlugin> &p_a, const Ref<EditorNode3DGizmoPlugin> &p_b) const { - return p_a->get_name() < p_b->get_name(); + return p_a->get_gizmo_name() < p_b->get_gizmo_name(); } }; @@ -7027,7 +7465,7 @@ void EditorNode3DGizmoPlugin::_bind_methods() { ClassDB::bind_method(D_METHOD("get_material", "name", "gizmo"), &EditorNode3DGizmoPlugin::get_material, DEFVAL(Ref<EditorNode3DGizmo>())); - BIND_VMETHOD(MethodInfo(Variant::STRING, "get_name")); + BIND_VMETHOD(MethodInfo(Variant::STRING, "get_gizmo_name")); BIND_VMETHOD(MethodInfo(Variant::INT, "get_priority")); BIND_VMETHOD(MethodInfo(Variant::BOOL, "can_be_hidden")); BIND_VMETHOD(MethodInfo(Variant::BOOL, "is_selectable_when_hidden")); diff --git a/editor/plugins/node_3d_editor_plugin.h b/editor/plugins/node_3d_editor_plugin.h index 9fb7488a0f..ff4a941b06 100644 --- a/editor/plugins/node_3d_editor_plugin.h +++ b/editor/plugins/node_3d_editor_plugin.h @@ -37,7 +37,10 @@ #include "scene/3d/immediate_geometry_3d.h" #include "scene/3d/light_3d.h" #include "scene/3d/visual_instance_3d.h" +#include "scene/3d/world_environment.h" #include "scene/gui/panel_container.h" +#include "scene/resources/environment.h" +#include "scene/resources/sky_material.h" class Camera3D; class Node3DEditor; @@ -96,6 +99,7 @@ protected: public: void add_lines(const Vector<Vector3> &p_lines, const Ref<Material> &p_material, bool p_billboard = false, const Color &p_modulate = Color(1, 1, 1)); + void add_vertices(const Vector<Vector3> &p_vertices, const Ref<Material> &p_material, Mesh::PrimitiveType p_primitive_type, bool p_billboard = false, const Color &p_modulate = Color(1, 1, 1)); void add_mesh(const Ref<ArrayMesh> &p_mesh, bool p_billboard = false, const Ref<SkinReference> &p_skin_reference = Ref<SkinReference>(), const Ref<Material> &p_material = Ref<Material>()); void add_collision_segments(const Vector<Vector3> &p_lines); void add_collision_triangles(const Ref<TriangleMesh> &p_tmesh); @@ -463,6 +467,8 @@ private: bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); + void _project_settings_changed(); + protected: void _notification(int p_what); static void _bind_methods(); @@ -730,6 +736,7 @@ private: static Node3DEditor *singleton; + void _node_added(Node *p_node); void _node_removed(Node *p_node); Vector<Ref<EditorNode3DGizmoPlugin>> gizmo_plugins_by_priority; Vector<Ref<EditorNode3DGizmoPlugin>> gizmo_plugins_by_name; @@ -742,6 +749,61 @@ private: void _refresh_menu_icons(); + // Preview Sun and Environment + + uint32_t world_env_count = 0; + uint32_t directional_light_count = 0; + + Button *sun_button; + Label *sun_state; + Label *sun_title; + VBoxContainer *sun_vb; + Popup *sun_environ_popup; + Control *sun_direction; + ColorPickerButton *sun_color; + EditorSpinSlider *sun_energy; + EditorSpinSlider *sun_max_distance; + Button *sun_add_to_scene; + + void _sun_direction_draw(); + void _sun_direction_input(const Ref<InputEvent> &p_event); + + Basis sun_rotation; + + Ref<Shader> sun_direction_shader; + Ref<ShaderMaterial> sun_direction_material; + + Button *environ_button; + Label *environ_state; + Label *environ_title; + VBoxContainer *environ_vb; + ColorPickerButton *environ_sky_color; + ColorPickerButton *environ_ground_color; + EditorSpinSlider *environ_energy; + Button *environ_ao_button; + Button *environ_glow_button; + Button *environ_tonemap_button; + Button *environ_gi_button; + Button *environ_add_to_scene; + + Button *sun_environ_settings; + + DirectionalLight3D *preview_sun; + WorldEnvironment *preview_environment; + Ref<Environment> environment; + Ref<ProceduralSkyMaterial> sky_material; + + bool sun_environ_updating = false; + + void _load_default_preview_settings(); + void _update_preview_environment(); + + void _preview_settings_changed(); + void _sun_environ_settings_pressed(); + + void _add_sun_to_scene(); + void _add_environment_to_scene(); + protected: void _notification(int p_what); //void _gui_input(InputEvent p_event); diff --git a/editor/plugins/packed_scene_translation_parser_plugin.cpp b/editor/plugins/packed_scene_translation_parser_plugin.cpp index 1f20a87565..0a949c8610 100644 --- a/editor/plugins/packed_scene_translation_parser_plugin.cpp +++ b/editor/plugins/packed_scene_translation_parser_plugin.cpp @@ -42,7 +42,7 @@ Error PackedSceneEditorTranslationParserPlugin::parse_file(const String &p_path, // These properties are translated with the tr() function in the C++ code when being set or updated. Error err; - RES loaded_res = ResourceLoader::load(p_path, "PackedScene", false, &err); + RES loaded_res = ResourceLoader::load(p_path, "PackedScene", ResourceFormatLoader::CACHE_MODE_REUSE, &err); if (err) { ERR_PRINT("Failed to load " + p_path); return err; diff --git a/editor/plugins/path_2d_editor_plugin.cpp b/editor/plugins/path_2d_editor_plugin.cpp index 908235f89f..84b4516452 100644 --- a/editor/plugins/path_2d_editor_plugin.cpp +++ b/editor/plugins/path_2d_editor_plugin.cpp @@ -88,7 +88,7 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { real_t dist_to_p_in = gpoint.distance_to(xform.xform(curve->get_point_position(i) + curve->get_point_in(i))); // Check for point movement start (for point + in/out controls). - if (mb->get_button_index() == BUTTON_LEFT) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mode == MODE_EDIT && !mb->get_shift() && dist_to_p < grab_threshold) { // Points can only be moved in edit mode. @@ -118,7 +118,7 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { } // Check for point deletion. - if ((mb->get_button_index() == BUTTON_RIGHT && mode == MODE_EDIT) || (mb->get_button_index() == BUTTON_LEFT && mode == MODE_DELETE)) { + if ((mb->get_button_index() == MOUSE_BUTTON_RIGHT && mode == MODE_EDIT) || (mb->get_button_index() == MOUSE_BUTTON_LEFT && mode == MODE_DELETE)) { if (dist_to_p < grab_threshold) { undo_redo->create_action(TTR("Remove Point from Curve")); undo_redo->add_do_method(curve.ptr(), "remove_point", i); @@ -149,7 +149,7 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { } // Check for point creation. - if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && ((mb->get_command() && mode == MODE_EDIT) || mode == MODE_CREATE)) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && ((mb->get_command() && mode == MODE_EDIT) || mode == MODE_CREATE)) { Ref<Curve2D> curve = node->get_curve(); undo_redo->create_action(TTR("Add Point to Curve")); @@ -170,7 +170,7 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { } // Check for segment split. - if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && mode == MODE_EDIT && on_edge) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && mode == MODE_EDIT && on_edge) { Vector2 gpoint2 = mb->get_position(); Ref<Curve2D> curve = node->get_curve(); @@ -207,7 +207,7 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { } // Check for point movement completion. - if (!mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && action != ACTION_NONE) { + if (!mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && action != ACTION_NONE) { Ref<Curve2D> curve = node->get_curve(); Vector2 new_pos = moving_from + xform.affine_inverse().basis_xform(gpoint - moving_screen_from); diff --git a/editor/plugins/path_3d_editor_plugin.cpp b/editor/plugins/path_3d_editor_plugin.cpp index 3783af8fc6..47bd1114d2 100644 --- a/editor/plugins/path_3d_editor_plugin.cpp +++ b/editor/plugins/path_3d_editor_plugin.cpp @@ -316,7 +316,7 @@ bool Path3DEditorPlugin::forward_spatial_gui_input(Camera3D *p_camera, const Ref set_handle_clicked(false); } - if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && (curve_create->is_pressed() || (curve_edit->is_pressed() && mb->get_control()))) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && (curve_create->is_pressed() || (curve_edit->is_pressed() && mb->get_control()))) { //click into curve, break it down Vector<Vector3> v3a = c->tessellate(); int idx = 0; @@ -411,7 +411,7 @@ bool Path3DEditorPlugin::forward_spatial_gui_input(Camera3D *p_camera, const Ref //add new at pos } - } else if (mb->is_pressed() && ((mb->get_button_index() == BUTTON_LEFT && curve_del->is_pressed()) || (mb->get_button_index() == BUTTON_RIGHT && curve_edit->is_pressed()))) { + } else if (mb->is_pressed() && ((mb->get_button_index() == MOUSE_BUTTON_LEFT && curve_del->is_pressed()) || (mb->get_button_index() == MOUSE_BUTTON_RIGHT && curve_edit->is_pressed()))) { for (int i = 0; i < c->get_point_count(); i++) { real_t dist_to_p = p_camera->unproject_position(gt.xform(c->get_point_position(i))).distance_to(mbpos); real_t dist_to_p_out = p_camera->unproject_position(gt.xform(c->get_point_position(i) + c->get_point_out(i))).distance_to(mbpos); diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp index 3d7b01c149..470d897dcc 100644 --- a/editor/plugins/polygon_2d_editor_plugin.cpp +++ b/editor/plugins/polygon_2d_editor_plugin.cpp @@ -447,7 +447,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) { Ref<InputEventMouseButton> mb = p_input; if (mb.is_valid()) { - if (mb->get_button_index() == BUTTON_LEFT) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->is_pressed()) { uv_drag_from = snap_point(Vector2(mb->get_position().x, mb->get_position().y)); uv_drag = true; @@ -759,7 +759,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) { bone_painting = false; } } - } else if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) { + } else if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) { _cancel_editing(); if (bone_painting) { @@ -768,9 +768,9 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) { uv_edit_draw->update(); - } else if (mb->get_button_index() == BUTTON_WHEEL_UP && mb->is_pressed()) { + } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP && mb->is_pressed()) { uv_zoom->set_value(uv_zoom->get_value() / (1 - (0.1 * mb->get_factor()))); - } else if (mb->get_button_index() == BUTTON_WHEEL_DOWN && mb->is_pressed()) { + } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN && mb->is_pressed()) { uv_zoom->set_value(uv_zoom->get_value() * (1 - (0.1 * mb->get_factor()))); } } @@ -778,7 +778,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) { Ref<InputEventMouseMotion> mm = p_input; if (mm.is_valid()) { - if ((mm->get_button_mask() & BUTTON_MASK_MIDDLE) || Input::get_singleton()->is_key_pressed(KEY_SPACE)) { + if ((mm->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE) || Input::get_singleton()->is_key_pressed(KEY_SPACE)) { Vector2 drag(mm->get_relative().x, mm->get_relative().y); uv_hscroll->set_value(uv_hscroll->get_value() - drag.x); uv_vscroll->set_value(uv_vscroll->get_value() - drag.y); diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index 216c0c3bef..b298474406 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -755,8 +755,8 @@ void ScriptEditor::_close_tab(int p_idx, bool p_save, bool p_history_back) { _save_layout(); } -void ScriptEditor::_close_current_tab() { - _close_tab(tab_container->get_current_tab()); +void ScriptEditor::_close_current_tab(bool p_save) { + _close_tab(tab_container->get_current_tab(), p_save); } void ScriptEditor::_close_discard_current_tab(const String &p_str) { @@ -802,7 +802,7 @@ void ScriptEditor::_close_other_tabs() { } } - _close_current_tab(); + _close_current_tab(false); } } @@ -820,7 +820,7 @@ void ScriptEditor::_close_all_tabs() { } } - _close_current_tab(); + _close_current_tab(false); } } @@ -894,7 +894,7 @@ void ScriptEditor::_reload_scripts() { Ref<Script> script = edited_res; if (script != nullptr) { - Ref<Script> rel_script = ResourceLoader::load(script->get_path(), script->get_class(), true); + Ref<Script> rel_script = ResourceLoader::load(script->get_path(), script->get_class(), ResourceFormatLoader::CACHE_MODE_IGNORE); ERR_CONTINUE(!rel_script.is_valid()); script->set_source_code(rel_script->get_source_code()); script->set_last_modified_time(rel_script->get_last_modified_time()); @@ -1372,7 +1372,7 @@ void ScriptEditor::_menu_option(int p_option) { if (current->is_unsaved()) { _ask_close_current_unsaved_tab(current); } else { - _close_current_tab(); + _close_current_tab(false); } } break; case FILE_COPY_PATH: { @@ -2737,7 +2737,7 @@ void ScriptEditor::_script_list_gui_input(const Ref<InputEvent> &ev) { Ref<InputEventMouseButton> mb = ev; if (mb.is_valid() && mb->is_pressed()) { switch (mb->get_button_index()) { - case BUTTON_MIDDLE: { + case MOUSE_BUTTON_MIDDLE: { // Right-click selects automatically; middle-click does not. int idx = script_list->get_item_at_position(mb->get_position(), true); if (idx >= 0) { @@ -2747,7 +2747,7 @@ void ScriptEditor::_script_list_gui_input(const Ref<InputEvent> &ev) { } } break; - case BUTTON_RIGHT: { + case MOUSE_BUTTON_RIGHT: { _make_script_list_context_menu(); } break; } @@ -3497,7 +3497,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) { erase_tab_confirm = memnew(ConfirmationDialog); erase_tab_confirm->get_ok_button()->set_text(TTR("Save")); erase_tab_confirm->add_button(TTR("Discard"), DisplayServer::get_singleton()->get_swap_cancel_ok(), "discard"); - erase_tab_confirm->connect("confirmed", callable_mp(this, &ScriptEditor::_close_current_tab)); + erase_tab_confirm->connect("confirmed", callable_mp(this, &ScriptEditor::_close_current_tab), varray(true)); erase_tab_confirm->connect("custom_action", callable_mp(this, &ScriptEditor::_close_discard_current_tab)); add_child(erase_tab_confirm); diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h index 09ed3854ea..b2172e7f10 100644 --- a/editor/plugins/script_editor_plugin.h +++ b/editor/plugins/script_editor_plugin.h @@ -325,7 +325,7 @@ class ScriptEditor : public PanelContainer { void _close_tab(int p_idx, bool p_save = true, bool p_history_back = true); - void _close_current_tab(); + void _close_current_tab(bool p_save = true); void _close_discard_current_tab(const String &p_str); void _close_docs_tab(); void _close_other_tabs(); diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index f57c8fbd6b..ec931caac3 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -688,7 +688,7 @@ void ScriptEditor::_update_modified_scripts_for_external_editor(Ref<Script> p_fo uint64_t date = FileAccess::get_modified_time(script->get_path()); if (last_date != date) { - Ref<Script> rel_script = ResourceLoader::load(script->get_path(), script->get_class(), true); + Ref<Script> rel_script = ResourceLoader::load(script->get_path(), script->get_class(), ResourceFormatLoader::CACHE_MODE_IGNORE); ERR_CONTINUE(!rel_script.is_valid()); script->set_source_code(rel_script->get_source_code()); script->set_last_modified_time(rel_script->get_last_modified_time()); @@ -1066,7 +1066,7 @@ void ScriptTextEditor::_edit_option(int p_op) { return; } - tx->indent_left(); + tx->indent_selected_lines_left(); } break; case EDIT_INDENT_RIGHT: { Ref<Script> scr = script; @@ -1074,7 +1074,7 @@ void ScriptTextEditor::_edit_option(int p_op) { return; } - tx->indent_right(); + tx->indent_selected_lines_right(); } break; case EDIT_DELETE_LINE: { code_editor->delete_lines(); @@ -1517,7 +1517,7 @@ void ScriptTextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) { bool create_menu = false; CodeEdit *tx = code_editor->get_text_editor(); - if (mb.is_valid() && mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) { + if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) { local_pos = mb->get_global_position() - tx->get_global_position(); create_menu = true; } else if (k.is_valid() && k->get_keycode() == KEY_MENU) { @@ -1632,16 +1632,16 @@ void ScriptTextEditor::_color_changed(const Color &p_color) { void ScriptTextEditor::_make_context_menu(bool p_selection, bool p_color, bool p_foldable, bool p_open_docs, bool p_goto_definition, Vector2 p_pos) { context_menu->clear(); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO); context_menu->add_separator(); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE); context_menu->add_separator(); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL); context_menu->add_separator(); context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_left"), EDIT_INDENT_LEFT); @@ -1743,14 +1743,14 @@ void ScriptTextEditor::_enable_code_editor() { search_menu->get_popup()->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_edit_option)); edit_hb->add_child(edit_menu); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO); edit_menu->get_popup()->add_separator(); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE); edit_menu->get_popup()->add_separator(); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL); edit_menu->get_popup()->add_separator(); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_up"), EDIT_MOVE_LINE_UP); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_down"), EDIT_MOVE_LINE_DOWN); @@ -1763,7 +1763,7 @@ void ScriptTextEditor::_enable_code_editor() { edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/unfold_all_lines"), EDIT_UNFOLD_ALL_LINES); edit_menu->get_popup()->add_separator(); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/clone_down"), EDIT_CLONE_DOWN); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/complete_symbol"), EDIT_COMPLETE); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_completion_query"), EDIT_COMPLETE); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/evaluate_selection"), EDIT_EVALUATE); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/trim_trailing_whitespace"), EDIT_TRIM_TRAILING_WHITESAPCE); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_indent_to_spaces"), EDIT_CONVERT_INDENT_TO_SPACES); @@ -1915,12 +1915,6 @@ static ScriptEditorBase *create_editor(const RES &p_resource) { } void ScriptTextEditor::register_editor() { - ED_SHORTCUT("script_text_editor/undo", TTR("Undo"), KEY_MASK_CMD | KEY_Z); - ED_SHORTCUT("script_text_editor/redo", TTR("Redo"), KEY_MASK_CMD | KEY_Y); - ED_SHORTCUT("script_text_editor/cut", TTR("Cut"), KEY_MASK_CMD | KEY_X); - ED_SHORTCUT("script_text_editor/copy", TTR("Copy"), KEY_MASK_CMD | KEY_C); - ED_SHORTCUT("script_text_editor/paste", TTR("Paste"), KEY_MASK_CMD | KEY_V); - ED_SHORTCUT("script_text_editor/select_all", TTR("Select All"), KEY_MASK_CMD | KEY_A); ED_SHORTCUT("script_text_editor/move_up", TTR("Move Up"), KEY_MASK_ALT | KEY_UP); ED_SHORTCUT("script_text_editor/move_down", TTR("Move Down"), KEY_MASK_ALT | KEY_DOWN); ED_SHORTCUT("script_text_editor/delete_line", TTR("Delete Line"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_K); @@ -1936,10 +1930,8 @@ void ScriptTextEditor::register_editor() { ED_SHORTCUT("script_text_editor/unfold_all_lines", TTR("Unfold All Lines"), 0); #ifdef OSX_ENABLED ED_SHORTCUT("script_text_editor/clone_down", TTR("Clone Down"), KEY_MASK_SHIFT | KEY_MASK_CMD | KEY_C); - ED_SHORTCUT("script_text_editor/complete_symbol", TTR("Complete Symbol"), KEY_MASK_CTRL | KEY_SPACE); #else ED_SHORTCUT("script_text_editor/clone_down", TTR("Clone Down"), KEY_MASK_CMD | KEY_D); - ED_SHORTCUT("script_text_editor/complete_symbol", TTR("Complete Symbol"), KEY_MASK_CMD | KEY_SPACE); #endif ED_SHORTCUT("script_text_editor/evaluate_selection", TTR("Evaluate Selection"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_E); ED_SHORTCUT("script_text_editor/trim_trailing_whitespace", TTR("Trim Trailing Whitespace"), KEY_MASK_CMD | KEY_MASK_ALT | KEY_T); diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp index 05a1561f7d..8f8a4b3054 100644 --- a/editor/plugins/shader_editor_plugin.cpp +++ b/editor/plugins/shader_editor_plugin.cpp @@ -282,7 +282,7 @@ void ShaderEditor::_menu_option(int p_option) { } CodeEdit *tx = shader_editor->get_text_editor(); - tx->indent_left(); + tx->indent_selected_lines_left(); } break; case EDIT_INDENT_RIGHT: { @@ -291,7 +291,7 @@ void ShaderEditor::_menu_option(int p_option) { } CodeEdit *tx = shader_editor->get_text_editor(); - tx->indent_right(); + tx->indent_selected_lines_right(); } break; case EDIT_DELETE_LINE: { @@ -405,7 +405,7 @@ void ShaderEditor::_check_for_external_edit() { } void ShaderEditor::_reload_shader_from_disk() { - Ref<Shader> rel_shader = ResourceLoader::load(shader->get_path(), shader->get_class(), true); + Ref<Shader> rel_shader = ResourceLoader::load(shader->get_path(), shader->get_class(), ResourceFormatLoader::CACHE_MODE_IGNORE); ERR_FAIL_COND(!rel_shader.is_valid()); shader->set_code(rel_shader->get_code()); @@ -460,7 +460,7 @@ void ShaderEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) { Ref<InputEventMouseButton> mb = ev; if (mb.is_valid()) { - if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) { + if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) { int col, row; CodeEdit *tx = shader_editor->get_text_editor(); tx->_get_mouse_pos(mb->get_global_position() - tx->get_global_position(), row, col); @@ -533,15 +533,15 @@ void ShaderEditor::_bookmark_item_pressed(int p_idx) { void ShaderEditor::_make_context_menu(bool p_selection, Vector2 p_position) { context_menu->clear(); if (p_selection) { - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY); } - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE); context_menu->add_separator(); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO); context_menu->add_separator(); context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_left"), EDIT_INDENT_LEFT); @@ -585,14 +585,14 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) { edit_menu->set_text(TTR("Edit")); edit_menu->set_switch_on_hover(true); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO); edit_menu->get_popup()->add_separator(); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE); edit_menu->get_popup()->add_separator(); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL); edit_menu->get_popup()->add_separator(); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_up"), EDIT_MOVE_LINE_UP); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_down"), EDIT_MOVE_LINE_DOWN); @@ -602,7 +602,7 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) { edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_comment"), EDIT_TOGGLE_COMMENT); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/clone_down"), EDIT_CLONE_DOWN); edit_menu->get_popup()->add_separator(); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/complete_symbol"), EDIT_COMPLETE); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_completion_query"), EDIT_COMPLETE); edit_menu->get_popup()->connect("id_pressed", callable_mp(this, &ShaderEditor::_menu_option)); search_menu = memnew(MenuButton); diff --git a/editor/plugins/skeleton_3d_editor_plugin.cpp b/editor/plugins/skeleton_3d_editor_plugin.cpp index e160e6ca0d..121ccfa417 100644 --- a/editor/plugins/skeleton_3d_editor_plugin.cpp +++ b/editor/plugins/skeleton_3d_editor_plugin.cpp @@ -388,7 +388,7 @@ PhysicalBone3D *Skeleton3DEditor::create_physical_bone(int bone_id, int bone_chi bone_shape->set_transform(capsule_transform); Transform body_transform; - body_transform.set_look_at(Vector3(0, 0, 0), child_rest.origin, Vector3(0, 1, 0)); + body_transform.set_look_at(Vector3(0, 0, 0), child_rest.origin); body_transform.origin = body_transform.basis.xform(Vector3(0, 0, -half_height)); Transform joint_transform; diff --git a/editor/plugins/sprite_2d_editor_plugin.cpp b/editor/plugins/sprite_2d_editor_plugin.cpp index 03ddaa2c74..4acacf3058 100644 --- a/editor/plugins/sprite_2d_editor_plugin.cpp +++ b/editor/plugins/sprite_2d_editor_plugin.cpp @@ -173,8 +173,13 @@ void Sprite2DEditor::_update_mesh_data() { Ref<Image> image = texture->get_data(); ERR_FAIL_COND(image.is_null()); + + if (image->is_compressed()) { + image->decompress(); + } + Rect2 rect; - if (node->is_region()) { + if (node->is_region_enabled()) { rect = node->get_region_rect(); } else { rect.size = Size2(image->get_width(), image->get_height()); diff --git a/editor/plugins/sprite_frames_editor_plugin.cpp b/editor/plugins/sprite_frames_editor_plugin.cpp index 0547f99079..bd6dac7490 100644 --- a/editor/plugins/sprite_frames_editor_plugin.cpp +++ b/editor/plugins/sprite_frames_editor_plugin.cpp @@ -105,7 +105,7 @@ void SpriteFramesEditor::_sheet_preview_draw() { void SpriteFramesEditor::_sheet_preview_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { Size2i size = split_sheet_preview->get_size(); int h = split_sheet_h->get_value(); int v = split_sheet_v->get_value(); @@ -150,11 +150,11 @@ void SpriteFramesEditor::_sheet_scroll_input(const Ref<InputEvent> &p_event) { // 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()) { + if (mb->get_button_index() == MOUSE_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()) { + } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN && mb->is_pressed() && mb->get_control()) { _sheet_zoom_out(); // Don't scroll down after zooming out. accept_event(); @@ -219,7 +219,8 @@ void SpriteFramesEditor::_sheet_zoom_out() { } void SpriteFramesEditor::_sheet_zoom_reset() { - sheet_zoom = 1.f; + // Default the zoom to match the editor scale, but don't dezoom on editor scales below 100% to prevent pixel art from looking bad. + sheet_zoom = MAX(1.0, EDSCALE); Size2 texture_size = split_sheet_preview->get_texture()->get_size(); split_sheet_preview->set_custom_minimum_size(texture_size * sheet_zoom); } @@ -693,11 +694,11 @@ 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()) { + if (mb->get_button_index() == MOUSE_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()) { + } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN && mb->is_pressed() && mb->get_control()) { _zoom_out(); // Don't scroll down after zooming out. accept_event(); @@ -732,7 +733,7 @@ void SpriteFramesEditor::_zoom_out() { } void SpriteFramesEditor::_zoom_reset() { - thumbnail_zoom = 1.0f; + thumbnail_zoom = MAX(1.0, EDSCALE); tree->set_fixed_column_width(thumbnail_default_size * 3 / 2); tree->set_fixed_icon_size(Size2(thumbnail_default_size, thumbnail_default_size)); } @@ -1229,13 +1230,14 @@ SpriteFramesEditor::SpriteFramesEditor() { // 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; + thumbnail_default_size = 96 * MAX(1.0, EDSCALE); + thumbnail_zoom = MAX(1.0, EDSCALE); + max_thumbnail_zoom = 8.0f * MAX(1.0, EDSCALE); + min_thumbnail_zoom = 0.1f * MAX(1.0, EDSCALE); + // Default the zoom to match the editor scale, but don't dezoom on editor scales below 100% to prevent pixel art from looking bad. + sheet_zoom = MAX(1.0, EDSCALE); + max_sheet_zoom = 16.0f * MAX(1.0, EDSCALE); + min_sheet_zoom = 0.01f * MAX(1.0, EDSCALE); _zoom_reset(); } diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp index d45011c8aa..2b8bfe067d 100644 --- a/editor/plugins/text_editor.cpp +++ b/editor/plugins/text_editor.cpp @@ -363,10 +363,10 @@ void TextEditor::_edit_option(int p_op) { code_editor->move_lines_down(); } break; case EDIT_INDENT_LEFT: { - tx->indent_left(); + tx->indent_selected_lines_left(); } break; case EDIT_INDENT_RIGHT: { - tx->indent_right(); + tx->indent_selected_lines_right(); } break; case EDIT_DELETE_LINE: { code_editor->delete_lines(); @@ -469,7 +469,7 @@ void TextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) { Ref<InputEventMouseButton> mb = ev; if (mb.is_valid()) { - if (mb->get_button_index() == BUTTON_RIGHT) { + if (mb->get_button_index() == MOUSE_BUTTON_RIGHT) { int col, row; CodeEdit *tx = code_editor->get_text_editor(); tx->_get_mouse_pos(mb->get_global_position() - tx->get_global_position(), row, col); @@ -514,15 +514,15 @@ void TextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) { void TextEditor::_make_context_menu(bool p_selection, bool p_can_fold, bool p_is_folded, Vector2 p_position) { context_menu->clear(); if (p_selection) { - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY); } - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE); context_menu->add_separator(); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO); - context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO); + context_menu->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO); context_menu->add_separator(); context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_left"), EDIT_INDENT_LEFT); context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_right"), EDIT_INDENT_RIGHT); @@ -584,14 +584,14 @@ TextEditor::TextEditor() { edit_menu->set_switch_on_hover(true); edit_menu->get_popup()->connect("id_pressed", callable_mp(this, &TextEditor::_edit_option)); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("un_redo"), EDIT_REDO); edit_menu->get_popup()->add_separator(); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE); edit_menu->get_popup()->add_separator(); - edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL); + edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL); edit_menu->get_popup()->add_separator(); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_up"), EDIT_MOVE_LINE_UP); edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_down"), EDIT_MOVE_LINE_DOWN); diff --git a/editor/plugins/texture_3d_editor_plugin.cpp b/editor/plugins/texture_3d_editor_plugin.cpp index 04e6aa6fa8..36297c8a4a 100644 --- a/editor/plugins/texture_3d_editor_plugin.cpp +++ b/editor/plugins/texture_3d_editor_plugin.cpp @@ -57,7 +57,7 @@ void Texture3DEditor::_notification(int p_what) { } } -void Texture3DEditor::_changed_callback(Object *p_changed, const char *p_prop) { +void Texture3DEditor::_texture_changed() { if (!is_visible()) { return; } @@ -118,7 +118,7 @@ void Texture3DEditor::_texture_rect_update_area() { void Texture3DEditor::edit(Ref<Texture3D> p_texture) { if (!texture.is_null()) { - texture->remove_change_receptor(this); + texture->disconnect("changed", callable_mp(this, &Texture3DEditor::_texture_changed)); } texture = p_texture; @@ -128,7 +128,7 @@ void Texture3DEditor::edit(Ref<Texture3D> p_texture) { _make_shaders(); } - texture->add_change_receptor(this); + texture->connect("changed", callable_mp(this, &Texture3DEditor::_texture_changed)); update(); texture_rect->set_material(material); setting = true; @@ -184,7 +184,7 @@ Texture3DEditor::Texture3DEditor() { Texture3DEditor::~Texture3DEditor() { if (!texture.is_null()) { - texture->remove_change_receptor(this); + texture->disconnect("changed", callable_mp(this, &Texture3DEditor::_texture_changed)); } } diff --git a/editor/plugins/texture_3d_editor_plugin.h b/editor/plugins/texture_3d_editor_plugin.h index 944abf16d9..9d90d3653f 100644 --- a/editor/plugins/texture_3d_editor_plugin.h +++ b/editor/plugins/texture_3d_editor_plugin.h @@ -61,10 +61,12 @@ class Texture3DEditor : public Control { void _texture_rect_update_area(); void _texture_rect_draw(); + void _texture_changed(); + protected: void _notification(int p_what); void _gui_input(Ref<InputEvent> p_event); - void _changed_callback(Object *p_changed, const char *p_prop) override; + static void _bind_methods(); public: diff --git a/editor/plugins/texture_editor_plugin.cpp b/editor/plugins/texture_editor_plugin.cpp index 1d3fd668c6..253f8878d2 100644 --- a/editor/plugins/texture_editor_plugin.cpp +++ b/editor/plugins/texture_editor_plugin.cpp @@ -104,7 +104,7 @@ void TextureEditor::_notification(int p_what) { } } -void TextureEditor::_changed_callback(Object *p_changed, const char *p_prop) { +void TextureEditor::_texture_changed() { if (!is_visible()) { return; } @@ -113,13 +113,13 @@ void TextureEditor::_changed_callback(Object *p_changed, const char *p_prop) { void TextureEditor::edit(Ref<Texture2D> p_texture) { if (!texture.is_null()) { - texture->remove_change_receptor(this); + texture->disconnect("changed", callable_mp(this, &TextureEditor::_texture_changed)); } texture = p_texture; if (!texture.is_null()) { - texture->add_change_receptor(this); + texture->connect("changed", callable_mp(this, &TextureEditor::_texture_changed)); update(); } else { hide(); @@ -137,7 +137,7 @@ TextureEditor::TextureEditor() { TextureEditor::~TextureEditor() { if (!texture.is_null()) { - texture->remove_change_receptor(this); + texture->disconnect("changed", callable_mp(this, &TextureEditor::_texture_changed)); } } diff --git a/editor/plugins/texture_editor_plugin.h b/editor/plugins/texture_editor_plugin.h index 621d737028..ebe8882194 100644 --- a/editor/plugins/texture_editor_plugin.h +++ b/editor/plugins/texture_editor_plugin.h @@ -43,7 +43,7 @@ class TextureEditor : public Control { protected: void _notification(int p_what); void _gui_input(Ref<InputEvent> p_event); - void _changed_callback(Object *p_changed, const char *p_prop) override; + void _texture_changed(); static void _bind_methods(); public: diff --git a/editor/plugins/texture_layered_editor_plugin.cpp b/editor/plugins/texture_layered_editor_plugin.cpp index 2be300ad66..265d4ccc1e 100644 --- a/editor/plugins/texture_layered_editor_plugin.cpp +++ b/editor/plugins/texture_layered_editor_plugin.cpp @@ -36,7 +36,7 @@ void TextureLayeredEditor::_gui_input(Ref<InputEvent> p_event) { Ref<InputEventMouseMotion> mm = p_event; - if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT) { + if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { y_rot += -mm->get_relative().x * 0.01; x_rot += mm->get_relative().y * 0.01; _update_material(); @@ -63,7 +63,7 @@ void TextureLayeredEditor::_notification(int p_what) { } } -void TextureLayeredEditor::_changed_callback(Object *p_changed, const char *p_prop) { +void TextureLayeredEditor::_texture_changed() { if (!is_visible()) { return; } @@ -173,7 +173,7 @@ void TextureLayeredEditor::_texture_rect_update_area() { void TextureLayeredEditor::edit(Ref<TextureLayered> p_texture) { if (!texture.is_null()) { - texture->remove_change_receptor(this); + texture->disconnect("changed", callable_mp(this, &TextureLayeredEditor::_texture_changed)); } texture = p_texture; @@ -183,7 +183,7 @@ void TextureLayeredEditor::edit(Ref<TextureLayered> p_texture) { _make_shaders(); } - texture->add_change_receptor(this); + texture->connect("changed", callable_mp(this, &TextureLayeredEditor::_texture_changed)); update(); texture_rect->set_material(materials[texture->get_layered_type()]); setting = true; @@ -248,9 +248,6 @@ TextureLayeredEditor::TextureLayeredEditor() { } TextureLayeredEditor::~TextureLayeredEditor() { - if (!texture.is_null()) { - texture->remove_change_receptor(this); - } } // diff --git a/editor/plugins/texture_layered_editor_plugin.h b/editor/plugins/texture_layered_editor_plugin.h index 4bcc8fa1f1..c4ced62fb9 100644 --- a/editor/plugins/texture_layered_editor_plugin.h +++ b/editor/plugins/texture_layered_editor_plugin.h @@ -63,10 +63,11 @@ class TextureLayeredEditor : public Control { void _texture_rect_update_area(); void _texture_rect_draw(); + void _texture_changed(); + protected: void _notification(int p_what); void _gui_input(Ref<InputEvent> p_event); - void _changed_callback(Object *p_changed, const char *p_prop) override; static void _bind_methods(); public: diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp index 61e0cc281d..7b927ad98b 100644 --- a/editor/plugins/texture_region_editor_plugin.cpp +++ b/editor/plugins/texture_region_editor_plugin.cpp @@ -285,7 +285,7 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) { Ref<InputEventMouseButton> mb = p_input; if (mb.is_valid()) { - if (mb->get_button_index() == BUTTON_LEFT) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->is_pressed()) { if (node_ninepatch || obj_styleBox.is_valid()) { edited_margin = -1; @@ -447,7 +447,7 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) { creating = false; } - } else if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) { + } else if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) { if (drag) { drag = false; if (edited_margin >= 0) { @@ -466,9 +466,9 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) { drag_index = -1; } } - } else if (mb->get_button_index() == BUTTON_WHEEL_UP && mb->is_pressed()) { + } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP && mb->is_pressed()) { _zoom_on_position(draw_zoom * ((0.95 + (0.05 * mb->get_factor())) / 0.95), mb->get_position()); - } else if (mb->get_button_index() == BUTTON_WHEEL_DOWN && mb->is_pressed()) { + } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN && mb->is_pressed()) { _zoom_on_position(draw_zoom * (1 - (0.05 * mb->get_factor())), mb->get_position()); } } @@ -476,24 +476,45 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) { Ref<InputEventMouseMotion> mm = p_input; if (mm.is_valid()) { - if (mm->get_button_mask() & BUTTON_MASK_MIDDLE || Input::get_singleton()->is_key_pressed(KEY_SPACE)) { + if (mm->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE || Input::get_singleton()->is_key_pressed(KEY_SPACE)) { Vector2 dragged(mm->get_relative().x / draw_zoom, mm->get_relative().y / draw_zoom); hscroll->set_value(hscroll->get_value() - dragged.x); vscroll->set_value(vscroll->get_value() - dragged.y); - } else if (drag) { if (edited_margin >= 0) { float new_margin = 0; - if (edited_margin == 0) { - new_margin = prev_margin + (mm->get_position().y - drag_from.y) / draw_zoom; - } else if (edited_margin == 1) { - new_margin = prev_margin - (mm->get_position().y - drag_from.y) / draw_zoom; - } else if (edited_margin == 2) { - new_margin = prev_margin + (mm->get_position().x - drag_from.x) / draw_zoom; - } else if (edited_margin == 3) { - new_margin = prev_margin - (mm->get_position().x - drag_from.x) / draw_zoom; + + if (snap_mode != SNAP_GRID) { + if (edited_margin == 0) { + new_margin = prev_margin + (mm->get_position().y - drag_from.y) / draw_zoom; + } else if (edited_margin == 1) { + new_margin = prev_margin - (mm->get_position().y - drag_from.y) / draw_zoom; + } else if (edited_margin == 2) { + new_margin = prev_margin + (mm->get_position().x - drag_from.x) / draw_zoom; + } else if (edited_margin == 3) { + new_margin = prev_margin - (mm->get_position().x - drag_from.x) / draw_zoom; + } else { + ERR_PRINT("Unexpected edited_margin"); + } + + if (snap_mode == SNAP_PIXEL) { + new_margin = Math::round(new_margin); + } } else { - ERR_PRINT("Unexpected edited_margin"); + Vector2 pos_snapped = snap_point(mtx.affine_inverse().xform(mm->get_position())); + Rect2 rect_rounded = Rect2(rect.position.round(), rect.size.round()); + + if (edited_margin == 0) { + new_margin = pos_snapped.y - rect_rounded.position.y; + } else if (edited_margin == 1) { + new_margin = rect_rounded.size.y + rect_rounded.position.y - pos_snapped.y; + } else if (edited_margin == 2) { + new_margin = pos_snapped.x - rect_rounded.position.x; + } else if (edited_margin == 3) { + new_margin = rect_rounded.size.x + rect_rounded.position.x - pos_snapped.x; + } else { + ERR_PRINT("Unexpected edited_margin"); + } } if (new_margin < 0) { @@ -842,19 +863,19 @@ Sprite2D *TextureRegionEditor::get_sprite() { void TextureRegionEditor::edit(Object *p_obj) { if (node_sprite) { - node_sprite->remove_change_receptor(this); + node_sprite->disconnect("changed", callable_mp(this, &TextureRegionEditor::_texture_changed)); } if (node_sprite_3d) { - node_sprite_3d->remove_change_receptor(this); + node_sprite_3d->disconnect("changed", callable_mp(this, &TextureRegionEditor::_texture_changed)); } if (node_ninepatch) { - node_ninepatch->remove_change_receptor(this); + node_ninepatch->disconnect("changed", callable_mp(this, &TextureRegionEditor::_texture_changed)); } if (obj_styleBox.is_valid()) { - obj_styleBox->remove_change_receptor(this); + obj_styleBox->disconnect("changed", callable_mp(this, &TextureRegionEditor::_texture_changed)); } if (atlas_tex.is_valid()) { - atlas_tex->remove_change_receptor(this); + atlas_tex->disconnect("changed", callable_mp(this, &TextureRegionEditor::_texture_changed)); } if (p_obj) { node_sprite = Object::cast_to<Sprite2D>(p_obj); @@ -866,7 +887,7 @@ void TextureRegionEditor::edit(Object *p_obj) { if (Object::cast_to<AtlasTexture>(p_obj)) { atlas_tex = Ref<AtlasTexture>(Object::cast_to<AtlasTexture>(p_obj)); } - p_obj->add_change_receptor(this); + p_obj->connect("changed", callable_mp(this, &TextureRegionEditor::_texture_changed)); _edit_region(); } else { node_sprite = nullptr; @@ -876,7 +897,7 @@ void TextureRegionEditor::edit(Object *p_obj) { atlas_tex = Ref<AtlasTexture>(nullptr); } edit_draw->update(); - if ((node_sprite && !node_sprite->is_region()) || (node_sprite_3d && !node_sprite_3d->is_region())) { + if ((node_sprite && !node_sprite->is_region_enabled()) || (node_sprite_3d && !node_sprite_3d->is_region_enabled())) { set_process(true); } if (!p_obj) { @@ -884,14 +905,11 @@ void TextureRegionEditor::edit(Object *p_obj) { } } -void TextureRegionEditor::_changed_callback(Object *p_changed, const char *p_prop) { +void TextureRegionEditor::_texture_changed() { if (!is_visible()) { return; } - String prop = p_prop; - if (prop == "atlas" || prop == "texture" || prop == "region") { - _edit_region(); - } + _edit_region(); } void TextureRegionEditor::_edit_region() { @@ -1097,7 +1115,7 @@ void TextureRegionEditorPlugin::_editor_visiblity_changed() { void TextureRegionEditorPlugin::make_visible(bool p_visible) { if (p_visible) { texture_region_button->show(); - bool is_node_configured = region_editor->is_stylebox() || region_editor->is_atlas_texture() || region_editor->is_ninepatch() || (region_editor->get_sprite() && region_editor->get_sprite()->is_region()) || (region_editor->get_sprite_3d() && region_editor->get_sprite_3d()->is_region()); + bool is_node_configured = region_editor->is_stylebox() || region_editor->is_atlas_texture() || region_editor->is_ninepatch() || (region_editor->get_sprite() && region_editor->get_sprite()->is_region_enabled()) || (region_editor->get_sprite_3d() && region_editor->get_sprite_3d()->is_region_enabled()); if ((is_node_configured && !manually_hidden) || texture_region_button->is_pressed()) { editor->make_bottom_panel_item_visible(region_editor); } diff --git a/editor/plugins/texture_region_editor_plugin.h b/editor/plugins/texture_region_editor_plugin.h index 56ccefb025..d3db0a08a9 100644 --- a/editor/plugins/texture_region_editor_plugin.h +++ b/editor/plugins/texture_region_editor_plugin.h @@ -117,6 +117,8 @@ class TextureRegionEditor : public VBoxContainer { void _update_rect(); void _update_autoslice(); + void _texture_changed(); + protected: void _notification(int p_what); void _node_removed(Object *p_obj); @@ -124,8 +126,6 @@ protected: Vector2 snap_point(Vector2 p_target) const; - virtual void _changed_callback(Object *p_changed, const char *p_prop) override; - public: void _edit_region(); void _region_draw(); diff --git a/editor/plugins/tile_map_editor_plugin.cpp b/editor/plugins/tile_map_editor_plugin.cpp index 6a16aa28a9..bd721244ea 100644 --- a/editor/plugins/tile_map_editor_plugin.cpp +++ b/editor/plugins/tile_map_editor_plugin.cpp @@ -40,9 +40,12 @@ void TileMapEditor::_node_removed(Node *p_node) { if (p_node == node && node) { - // Fixes #44824, which describes a situation where you can reselect a TileMap node without first de-selecting it when switching scenes. - node->disconnect("settings_changed", callable_mp(this, &TileMapEditor::_tileset_settings_changed)); + Callable callable_tileset_settings_changed = callable_mp(this, &TileMapEditor::_tileset_settings_changed); + if (node->is_connected("settings_changed", callable_tileset_settings_changed)) { + // Fixes #44824, which describes a situation where you can reselect a TileMap node without first de-selecting it when switching scenes. + node->disconnect("settings_changed", callable_tileset_settings_changed); + } node = nullptr; } } @@ -230,11 +233,11 @@ void TileMapEditor::_palette_input(const Ref<InputEvent> &p_event) { // Zoom in/out using Ctrl + mouse wheel. if (mb.is_valid() && mb->is_pressed() && mb->get_command()) { - if (mb->is_pressed() && mb->get_button_index() == BUTTON_WHEEL_UP) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) { size_slider->set_value(size_slider->get_value() + 0.2); } - if (mb->is_pressed() && mb->get_button_index() == BUTTON_WHEEL_DOWN) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) { size_slider->set_value(size_slider->get_value() - 0.2); } } @@ -963,9 +966,9 @@ void TileMapEditor::_update_copydata() { tcd.flip_v = node->is_cell_y_flipped(j, i); tcd.transpose = node->is_cell_transposed(j, i); tcd.autotile_coord = node->get_cell_autotile_coord(j, i); - } - copydata.push_back(tcd); + copydata.push_back(tcd); + } } } } @@ -1024,7 +1027,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->get_button_index() == BUTTON_LEFT) { + if (mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->is_pressed()) { if (Input::get_singleton()->is_key_pressed(KEY_SPACE)) { return false; // Drag. @@ -1174,7 +1177,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { return true; } } - } else if (mb->get_button_index() == BUTTON_RIGHT) { + } else if (mb->get_button_index() == MOUSE_BUTTON_RIGHT) { if (mb->is_pressed()) { if (tool == TOOL_SELECTING || selection_active) { tool = TOOL_NONE; @@ -1459,7 +1462,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { return true; } - if (tool == TOOL_PICKING && Input::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT)) { + if (tool == TOOL_PICKING && Input::get_singleton()->is_mouse_button_pressed(MOUSE_BUTTON_LEFT)) { _pick_tile(over_tile); return true; @@ -1870,7 +1873,11 @@ void TileMapEditor::edit(Node *p_tile_map) { } if (node) { - node->disconnect("settings_changed", callable_mp(this, &TileMapEditor::_tileset_settings_changed)); + Callable callable_tileset_settings_changed = callable_mp(this, &TileMapEditor::_tileset_settings_changed); + + if (node->is_connected("settings_changed", callable_tileset_settings_changed)) { + node->disconnect("settings_changed", callable_tileset_settings_changed); + } } if (p_tile_map) { node = Object::cast_to<TileMap>(p_tile_map); @@ -1897,7 +1904,11 @@ void TileMapEditor::edit(Node *p_tile_map) { } if (node) { - node->connect("settings_changed", callable_mp(this, &TileMapEditor::_tileset_settings_changed)); + Callable callable_tileset_settings_changed = callable_mp(this, &TileMapEditor::_tileset_settings_changed); + + if (!node->is_connected("settings_changed", callable_tileset_settings_changed)) { + node->connect("settings_changed", callable_tileset_settings_changed); + } } _clear_bucket_cache(); diff --git a/editor/plugins/tile_set_editor_plugin.cpp b/editor/plugins/tile_set_editor_plugin.cpp index deeab2fbc7..cca4f594e9 100644 --- a/editor/plugins/tile_set_editor_plugin.cpp +++ b/editor/plugins/tile_set_editor_plugin.cpp @@ -39,7 +39,6 @@ void TileSetEditor::edit(const Ref<TileSet> &p_tileset) { tileset = p_tileset; - tileset->add_change_receptor(this); texture_list->clear(); texture_map.clear(); @@ -81,7 +80,7 @@ void TileSetEditor::_import_node(Node *p_node, Ref<TileSet> p_library) { Vector2 phys_offset; Size2 s; - if (mi->is_region()) { + if (mi->is_region_enabled()) { s = mi->get_region_rect().size; p_library->tile_set_region(id, mi->get_region_rect()); } else { @@ -1247,12 +1246,12 @@ void TileSetEditor::_on_scroll_container_input(const Ref<InputEvent> &p_event) { // 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()) { + if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP && mb->is_pressed() && mb->get_control()) { print_line("zooming in"); _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()) { + } else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN && mb->is_pressed() && mb->get_control()) { print_line("zooming out"); _zoom_out(); // Don't scroll down after zooming out. @@ -1281,7 +1280,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { const Ref<InputEventMouseMotion> mm = p_ie; if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && !creating_shape) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && !creating_shape) { if (!current_tile_region.has_point(mb->get_position())) { List<int> *tiles = new List<int>(); tileset->get_tile_list(tiles); @@ -1305,7 +1304,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { } // Drag Middle Mouse if (mm.is_valid()) { - if (mm->get_button_mask() & BUTTON_MASK_MIDDLE) { + if (mm->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE) { Vector2 dragged(mm->get_relative().x, mm->get_relative().y); scroll->set_h_scroll(scroll->get_h_scroll() - dragged.x * workspace->get_scale().x); scroll->set_v_scroll(scroll->get_v_scroll() - dragged.y * workspace->get_scale().x); @@ -1314,7 +1313,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { if (edit_mode == EDITMODE_REGION) { if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (get_current_tile() >= 0 || workspace_mode != WORKSPACE_EDIT) { dragging = true; region_from = mb->get_position(); @@ -1323,13 +1322,13 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { workspace_overlay->update(); return; } - } else if (dragging && mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) { + } else if (dragging && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { dragging = false; edited_region = Rect2(); workspace->update(); workspace_overlay->update(); return; - } else if (dragging && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + } else if (dragging && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { dragging = false; update_edited_region(mb->get_position()); edited_region.position -= WORKSPACE_MARGIN; @@ -1429,7 +1428,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { switch (edit_mode) { case EDITMODE_ICON: { if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && current_tile_region.has_point(mb->get_position())) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && current_tile_region.has_point(mb->get_position())) { Vector2 coord((int)((mb->get_position().x - current_tile_region.position.x) / (spacing + size.x)), (int)((mb->get_position().y - current_tile_region.position.y) / (spacing + size.y))); undo_redo->create_action(TTR("Set Tile Icon")); undo_redo->add_do_method(tileset.ptr(), "autotile_set_icon_coordinate", get_current_tile(), coord); @@ -1446,9 +1445,9 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { if (dragging) { return; } - if ((mb->get_button_index() == BUTTON_RIGHT || mb->get_button_index() == BUTTON_LEFT) && current_tile_region.has_point(mb->get_position())) { + if ((mb->get_button_index() == MOUSE_BUTTON_RIGHT || mb->get_button_index() == MOUSE_BUTTON_LEFT) && current_tile_region.has_point(mb->get_position())) { dragging = true; - erasing = (mb->get_button_index() == BUTTON_RIGHT); + erasing = (mb->get_button_index() == MOUSE_BUTTON_RIGHT); alternative = Input::get_singleton()->is_key_pressed(KEY_SHIFT); Vector2 coord((int)((mb->get_position().x - current_tile_region.position.x) / (spacing + size.x)), (int)((mb->get_position().y - current_tile_region.position.y) / (spacing + size.y))); Vector2 pos(coord.x * (spacing + size.x), coord.y * (spacing + size.y)); @@ -1519,7 +1518,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { } } } else { - if ((erasing && mb->get_button_index() == BUTTON_RIGHT) || (!erasing && mb->get_button_index() == BUTTON_LEFT)) { + if ((erasing && mb->get_button_index() == MOUSE_BUTTON_RIGHT) || (!erasing && mb->get_button_index() == MOUSE_BUTTON_LEFT)) { dragging = false; erasing = false; alternative = false; @@ -1613,7 +1612,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { shape_anchor += current_tile_region.position; if (tools[TOOL_SELECT]->is_pressed()) { if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (edit_mode != EDITMODE_PRIORITY && current_shape.size() > 0) { int grabbed_point = get_grabbed_point(mb->get_position(), grab_threshold); @@ -1631,7 +1630,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { } } workspace->update(); - } else if (!mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + } else if (!mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (edit_mode == EDITMODE_COLLISION) { if (dragging_point >= 0) { dragging_point = -1; @@ -1706,7 +1705,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { } } else if (tools[SHAPE_NEW_POLYGON]->is_pressed()) { if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { Vector2 pos = mb->get_position(); pos = snap_point(pos); if (creating_shape) { @@ -1726,7 +1725,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { current_shape.push_back(snap_point(pos)); workspace->update(); } - } else if (mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) { + } else if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { if (creating_shape) { creating_shape = false; _select_edited_shape_coord(); @@ -1740,7 +1739,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { } } else if (tools[SHAPE_NEW_RECTANGLE]->is_pressed()) { if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { _set_edited_collision_shape(Ref<ConvexPolygonShape2D>()); current_shape.resize(0); Vector2 pos = mb->get_position(); @@ -1752,13 +1751,13 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { creating_shape = true; workspace->update(); return; - } else if (mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) { + } else if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { if (creating_shape) { creating_shape = false; _select_edited_shape_coord(); workspace->update(); } - } else if (!mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + } else if (!mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (creating_shape) { // if the first two corners are within grabbing distance of one another, expand the rect to fill the tile if (is_within_grabbing_distance_of_first_point(current_shape[1], grab_threshold)) { @@ -1859,7 +1858,7 @@ void TileSetEditor::_on_tool_clicked(int p_tool) { _update_toggle_shape_button(); workspace->update(); workspace_container->update(); - helper->_change_notify(""); + helper->notify_property_list_changed(); } } else if (p_tool == SELECT_NEXT) { _select_next_shape(); @@ -2173,7 +2172,7 @@ Array TileSetEditor::_get_tiles_in_current_texture(bool sorted) { } } if (sorted) { - a.sort_custom(this, "_sort_tiles"); + a.sort_custom(callable_mp(this, &TileSetEditor::_sort_tiles)); } return a; } @@ -2287,7 +2286,7 @@ void TileSetEditor::_select_next_shape() { } workspace->update(); workspace_container->update(); - helper->_change_notify(""); + helper->notify_property_list_changed(); } } @@ -2349,7 +2348,7 @@ void TileSetEditor::_select_previous_shape() { } workspace->update(); workspace_container->update(); - helper->_change_notify(""); + helper->notify_property_list_changed(); } } @@ -3012,7 +3011,7 @@ void TileSetEditor::close_shape(const Vector2 &shape_anchor) { undo_redo->add_undo_method(this, "_select_edited_shape_coord"); undo_redo->commit_action(); } - tileset->_change_notify(""); + tileset->notify_property_list_changed(); } void TileSetEditor::select_coord(const Vector2 &coord) { @@ -3115,7 +3114,7 @@ void TileSetEditor::select_coord(const Vector2 &coord) { } workspace->update(); workspace_container->update(); - helper->_change_notify(""); + helper->notify_property_list_changed(); } Vector2 TileSetEditor::snap_point(const Vector2 &point) { @@ -3225,7 +3224,7 @@ void TileSetEditor::update_texture_list() { workspace_overlay->update(); } update_texture_list_icon(); - helper->_change_notify(""); + helper->notify_property_list_changed(); } void TileSetEditor::update_texture_list_icon() { @@ -3389,7 +3388,7 @@ int TileSetEditor::get_current_tile() const { void TileSetEditor::set_current_tile(int p_id) { if (current_tile != p_id) { current_tile = p_id; - helper->_change_notify(""); + helper->notify_property_list_changed(); select_coord(Vector2(0, 0)); update_workspace_tile_mode(); if (p_id == -1) { @@ -3414,7 +3413,7 @@ void TilesetEditorContext::set_tileset(const Ref<TileSet> &p_tileset) { void TilesetEditorContext::set_snap_options_visible(bool p_visible) { snap_options_visible = p_visible; - _change_notify(""); + notify_property_list_changed(); } bool TilesetEditorContext::_set(const StringName &p_name, const Variant &p_value) { @@ -3450,7 +3449,7 @@ bool TilesetEditorContext::_set(const StringName &p_name, const Variant &p_value tileset->set(String::num(tileset_editor->get_current_tile(), 0) + "/" + name2, p_value, &v); } if (v) { - tileset->_change_notify(""); + tileset->notify_property_list_changed(); tileset_editor->workspace->update(); tileset_editor->workspace_overlay->update(); } diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index 5061067ded..69bdc05b3a 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -1023,7 +1023,7 @@ void VisualShaderEditor::_update_options_menu() { Color unsupported_color = get_theme_color("error_color", "Editor"); Color supported_color = get_theme_color("warning_color", "Editor"); - static bool low_driver = ProjectSettings::get_singleton()->get("rendering/quality/driver/driver_name") == "GLES2"; + static bool low_driver = ProjectSettings::get_singleton()->get("rendering/driver/driver_name") == "GLES2"; Map<String, TreeItem *> folders; @@ -2504,7 +2504,7 @@ void VisualShaderEditor::_graph_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; VisualShader::Type type = get_current_shader_type(); - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) { selected_constants.clear(); selected_uniforms.clear(); diff --git a/editor/pot_generator.cpp b/editor/pot_generator.cpp index 2d65c00a89..497cc0cbdc 100644 --- a/editor/pot_generator.cpp +++ b/editor/pot_generator.cpp @@ -55,7 +55,7 @@ void POTGenerator::_print_all_translation_strings() { #endif void POTGenerator::generate_pot(const String &p_file) { - if (!ProjectSettings::get_singleton()->has_setting("locale/translations_pot_files")) { + if (!ProjectSettings::get_singleton()->has_setting("internationalization/locale/translations_pot_files")) { WARN_PRINT("No files selected for POT generation."); return; } @@ -63,7 +63,7 @@ void POTGenerator::generate_pot(const String &p_file) { // Clear all_translation_strings of the previous round. all_translation_strings.clear(); - Vector<String> files = ProjectSettings::get_singleton()->get("locale/translations_pot_files"); + Vector<String> files = ProjectSettings::get_singleton()->get("internationalization/locale/translations_pot_files"); // Collect all translatable strings according to files order in "POT Generation" setting. for (int i = 0; i < files.size(); i++) { @@ -100,7 +100,7 @@ void POTGenerator::_write_to_pot(const String &p_file) { } String project_name = ProjectSettings::get_singleton()->get("application/config/name"); - Vector<String> files = ProjectSettings::get_singleton()->get("locale/translations_pot_files"); + Vector<String> files = ProjectSettings::get_singleton()->get("internationalization/locale/translations_pot_files"); String extracted_files = ""; for (int i = 0; i < files.size(); i++) { extracted_files += "# " + files[i] + "\n"; diff --git a/editor/project_export.cpp b/editor/project_export.cpp index 4bcb616fbd..b7dd1013f3 100644 --- a/editor/project_export.cpp +++ b/editor/project_export.cpp @@ -37,7 +37,7 @@ #include "core/os/dir_access.h" #include "core/os/file_access.h" #include "core/os/os.h" -#include "core/string/compressed_translation.h" +#include "core/string/optimized_translation.h" #include "editor_data.h" #include "editor_node.h" #include "editor_scale.h" diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index 5951373af9..914806039f 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -474,20 +474,20 @@ private: } ProjectSettings::CustomMap initial_settings; if (rasterizer_button_group->get_pressed_button()->get_meta("driver_name") == "Vulkan") { - initial_settings["rendering/quality/driver/driver_name"] = "Vulkan"; + initial_settings["rendering/driver/driver_name"] = "Vulkan"; } else { - initial_settings["rendering/quality/driver/driver_name"] = "GLES2"; - initial_settings["rendering/vram_compression/import_etc2"] = false; - initial_settings["rendering/vram_compression/import_etc"] = true; + initial_settings["rendering/driver/driver_name"] = "GLES2"; + initial_settings["rendering/textures/vram_compression/import_etc2"] = false; + initial_settings["rendering/textures/vram_compression/import_etc"] = true; } initial_settings["application/config/name"] = project_name->get_text(); initial_settings["application/config/icon"] = "res://icon.png"; - initial_settings["rendering/environment/default_environment"] = "res://default_env.tres"; + initial_settings["rendering/environment/defaults/default_environment"] = "res://default_env.tres"; if (ProjectSettings::get_singleton()->save_custom(dir.plus_file("project.godot"), initial_settings, Vector<String>(), false) != OK) { set_message(TTR("Couldn't create project.godot in project path."), MESSAGE_ERROR); } else { - ResourceSaver::save(dir.plus_file("icon.png"), msg->get_theme_icon("DefaultProjectIcon", "EditorIcons")); + ResourceSaver::save(dir.plus_file("icon.png"), create_unscaled_default_project_icon()); FileAccess *f = FileAccess::open(dir.plus_file("default_env.tres"), FileAccess::WRITE); if (!f) { @@ -1741,7 +1741,7 @@ void ProjectList::_panel_input(const Ref<InputEvent> &p_ev, Node *p_hb) { int clicked_index = p_hb->get_index(); const Item &clicked_project = _projects[clicked_index]; - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { if (mb->get_shift() && _selected_project_keys.size() > 0 && _last_clicked != "" && clicked_project.project_key != _last_clicked) { int anchor_index = -1; for (int i = 0; i < _projects.size(); ++i) { @@ -2015,6 +2015,10 @@ void ProjectManager::_confirm_update_settings() { } void ProjectManager::_open_selected_projects() { + // Show loading text to tell the user that the project manager is busy loading. + // This is especially important for the HTML5 project manager. + loading_label->set_modulate(Color(1, 1, 1)); + const Set<String> &selected_list = _project_list->get_selected_project_keys(); for (const Set<String>::Element *E = selected_list.front(); E; E = E->next()) { @@ -2268,11 +2272,6 @@ void ProjectManager::_restart_confirm() { get_tree()->quit(); } -void ProjectManager::_exit_dialog() { - _dim_window(); - get_tree()->quit(); -} - void ProjectManager::_install_project(const String &p_zip_path, const String &p_title) { npdialog->set_mode(ProjectDialog::MODE_INSTALL); npdialog->set_zip_path(p_zip_path); @@ -2281,6 +2280,11 @@ void ProjectManager::_install_project(const String &p_zip_path, const String &p_ } void ProjectManager::_files_dropped(PackedStringArray p_files, int p_screen) { + if (p_files.size() == 1 && p_files[0].ends_with(".zip")) { + const String file = p_files[0].get_file(); + _install_project(p_files[0], file.substr(0, file.length() - 4).capitalize()); + return; + } Set<String> folders_set; DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); for (int i = 0; i < p_files.size(); i++) { @@ -2346,7 +2350,6 @@ void ProjectManager::_on_search_term_changed(const String &p_term) { } void ProjectManager::_bind_methods() { - ClassDB::bind_method("_exit_dialog", &ProjectManager::_exit_dialog); ClassDB::bind_method("_unhandled_key_input", &ProjectManager::_unhandled_key_input); ClassDB::bind_method("_update_project_buttons", &ProjectManager::_update_project_buttons); } @@ -2380,6 +2383,10 @@ ProjectManager::ProjectManager() { if (DisplayServer::get_singleton()->screen_get_dpi(screen) >= 192 && DisplayServer::get_singleton()->screen_get_size(screen).y >= 1400) { // hiDPI display. scale = 2.0; + } else if (DisplayServer::get_singleton()->screen_get_size(screen).y >= 1700) { + // Likely a hiDPI display, but we aren't certain due to the returned DPI. + // Use an intermediate scale to handle this situation. + scale = 1.5; } else if (DisplayServer::get_singleton()->screen_get_size(screen).y <= 800) { // Small loDPI display. Use a smaller display scale so that editor elements fit more easily. // Icons won't look great, but this is better than having editor elements overflow from its window. @@ -2476,7 +2483,12 @@ ProjectManager::ProjectManager() { search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL); hb->add_child(search_box); - hb->add_spacer(); + loading_label = memnew(Label(TTR("Loading, please wait..."))); + loading_label->add_theme_font_override("font", get_theme_font("bold", "EditorFonts")); + loading_label->set_h_size_flags(Control::SIZE_EXPAND_FILL); + hb->add_child(loading_label); + // Hide the label but make it still take up space. This prevents reflows when showing the label. + loading_label->set_modulate(Color(0, 0, 0, 0)); Label *sort_label = memnew(Label); sort_label->set_text(TTR("Sort:")); diff --git a/editor/project_manager.h b/editor/project_manager.h index db8cb8410c..6dc0e67cba 100644 --- a/editor/project_manager.h +++ b/editor/project_manager.h @@ -54,6 +54,7 @@ class ProjectManager : public Control { ProjectList *_project_list; LineEdit *search_box; + Label *loading_label; OptionButton *filter_option; Button *run_btn; @@ -98,7 +99,6 @@ class ProjectManager : public Control { void _update_project_buttons(); void _language_selected(int p_id); void _restart_confirm(); - void _exit_dialog(); void _confirm_update_settings(); void _nonempty_confirmation_ok_pressed(); diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp index 4516180fa5..de7996eaa2 100644 --- a/editor/project_settings_editor.cpp +++ b/editor/project_settings_editor.cpp @@ -52,9 +52,11 @@ void ProjectSettingsEditor::popup_project_settings() { localization_editor->update_translations(); autoload_settings->update_autoload(); plugin_settings->update_plugins(); + import_defaults_editor->clear(); } void ProjectSettingsEditor::queue_save() { + EditorNode::get_singleton()->notify_settings_changed(); timer->start(); } @@ -74,8 +76,12 @@ void ProjectSettingsEditor::_advanced_pressed() { if (advanced->is_pressed()) { _update_advanced_bar(); advanced_bar->show(); + EditorSettings::get_singleton()->set_project_metadata("project_settings", "advanced_mode", true); + inspector->set_restrict_to_basic_settings(false); } else { advanced_bar->hide(); + EditorSettings::get_singleton()->set_project_metadata("project_settings", "advanced_mode", false); + inspector->set_restrict_to_basic_settings(true); } } @@ -190,9 +196,6 @@ void ProjectSettingsEditor::_update_advanced_bar() { add_button->set_disabled(disable_add); del_button->set_disabled(disable_del); - - error_label->set_text(error_msg); - error_label->set_visible(error_msg != ""); } String ProjectSettingsEditor::_get_setting_name() const { @@ -255,6 +258,7 @@ void ProjectSettingsEditor::_add_feature_overrides() { } void ProjectSettingsEditor::_editor_restart() { + ProjectSettings::get_singleton()->save(); EditorNode::get_singleton()->save_all_scenes(); EditorNode::get_singleton()->restart_editor(); } @@ -267,21 +271,216 @@ void ProjectSettingsEditor::_editor_restart_close() { restart_container->hide(); } +void ProjectSettingsEditor::_action_added(const String &p_name) { + String name = "input/" + p_name; + + if (ProjectSettings::get_singleton()->has_setting(name)) { + action_map->show_message(vformat(TTR("An action with the name '%s' already exists."), name)); + return; + } + + Dictionary action; + action["events"] = Array(); + action["deadzone"] = 0.5f; + + undo_redo->create_action(TTR("Add Input Action")); + undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, action); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "clear", name); + + undo_redo->add_do_method(this, "_update_action_map_editor"); + undo_redo->add_undo_method(this, "_update_action_map_editor"); + undo_redo->add_do_method(this, "queue_save"); + undo_redo->add_undo_method(this, "queue_save"); + undo_redo->commit_action(); +} + +void ProjectSettingsEditor::_action_edited(const String &p_name, const Dictionary &p_action) { + const String property_name = "input/" + p_name; + Dictionary old_val = ProjectSettings::get_singleton()->get(property_name); + + if (old_val["deadzone"] != p_action["deadzone"]) { + // Deadzone Changed + undo_redo->create_action(TTR("Change Action deadzone")); + undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", property_name, p_action); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", property_name, old_val); + + } else { + // Events changed + int event_count = ((Array)p_action["events"]).size(); + int old_event_count = ((Array)old_val["events"]).size(); + + if (event_count == old_event_count) { + undo_redo->create_action(TTR("Edit Input Action Event")); + } else if (event_count > old_event_count) { + undo_redo->create_action(TTR("Add Input Action Event")); + } else if (event_count < old_event_count) { + undo_redo->create_action(TTR("Remove Input Action Event")); + } + + undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", property_name, p_action); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", property_name, old_val); + } + + undo_redo->add_do_method(this, "_update_action_map_editor"); + undo_redo->add_undo_method(this, "_update_action_map_editor"); + undo_redo->add_do_method(this, "queue_save"); + undo_redo->add_undo_method(this, "queue_save"); + undo_redo->commit_action(); +} + +void ProjectSettingsEditor::_action_removed(const String &p_name) { + const String property_name = "input/" + p_name; + + Dictionary old_val = ProjectSettings::get_singleton()->get(property_name); + int order = ProjectSettings::get_singleton()->get_order(property_name); + + undo_redo->create_action(TTR("Erase Input Action")); + undo_redo->add_do_method(ProjectSettings::get_singleton(), "clear", property_name); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", property_name, old_val); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", property_name, order); + + undo_redo->add_do_method(this, "_update_action_map_editor"); + undo_redo->add_undo_method(this, "_update_action_map_editor"); + undo_redo->add_do_method(this, "queue_save"); + undo_redo->add_undo_method(this, "queue_save"); + undo_redo->commit_action(); +} + +void ProjectSettingsEditor::_action_renamed(const String &p_old_name, const String &p_new_name) { + const String old_property_name = "input/" + p_old_name; + const String new_property_name = "input/" + p_new_name; + + if (ProjectSettings::get_singleton()->has_setting(new_property_name)) { + action_map->show_message(vformat(TTR("An action with the name '%s' already exists."), new_property_name)); + return; + } + + int order = ProjectSettings::get_singleton()->get_order(old_property_name); + Dictionary action = ProjectSettings::get_singleton()->get(old_property_name); + + undo_redo->create_action(TTR("Rename Input Action Event")); + // Do: clear old, set new + undo_redo->add_do_method(ProjectSettings::get_singleton(), "clear", old_property_name); + undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", new_property_name, action); + undo_redo->add_do_method(ProjectSettings::get_singleton(), "set_order", new_property_name, order); + // Undo: clear new, set old + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "clear", new_property_name); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", old_property_name, action); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set_order", old_property_name, order); + + undo_redo->add_do_method(this, "_update_action_map_editor"); + undo_redo->add_undo_method(this, "_update_action_map_editor"); + undo_redo->add_do_method(this, "queue_save"); + undo_redo->add_undo_method(this, "queue_save"); + undo_redo->commit_action(); +} + +void ProjectSettingsEditor::_action_reordered(const String &p_action_name, const String &p_relative_to, bool p_before) { + const String action_name = "input/" + p_action_name; + const String target_name = "input/" + p_relative_to; + + // It is much easier to rebuild the custom "input" properties rather than messing around with the "order" values of them. + Variant action_value = ps->get(action_name); + Variant target_value = ps->get(target_name); + + List<PropertyInfo> props; + OrderedHashMap<String, Variant> action_values; + ProjectSettings::get_singleton()->get_property_list(&props); + + undo_redo->create_action(TTR("Update Input Action Order")); + + for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) { + PropertyInfo prop = E->get(); + // Skip builtins and non-inputs + if (ProjectSettings::get_singleton()->is_builtin_setting(prop.name) || !prop.name.begins_with("input/")) { + continue; + } + + action_values.insert(prop.name, ps->get(prop.name)); + + undo_redo->add_do_method(ProjectSettings::get_singleton(), "clear", prop.name); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "clear", prop.name); + } + + for (OrderedHashMap<String, Variant>::Element E = action_values.front(); E; E = E.next()) { + String name = E.key(); + Variant value = E.get(); + + if (name == target_name) { + if (p_before) { + // Insert before target + undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", action_name, action_value); + undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", target_name, target_value); + + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", target_name, target_value); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", action_name, action_value); + } else { + // Insert after target + undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", target_name, target_value); + undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", action_name, action_value); + + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", action_name, action_value); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", target_name, target_value); + } + + } else if (name != action_name) { + undo_redo->add_do_method(ProjectSettings::get_singleton(), "set", name, value); + undo_redo->add_undo_method(ProjectSettings::get_singleton(), "set", name, value); + } + } + + undo_redo->add_do_method(this, "_update_action_map_editor"); + undo_redo->add_undo_method(this, "_update_action_map_editor"); + undo_redo->add_do_method(this, "queue_save"); + undo_redo->add_undo_method(this, "queue_save"); + undo_redo->commit_action(); +} + +void ProjectSettingsEditor::_update_action_map_editor() { + Vector<ActionMapEditor::ActionInfo> actions; + + List<PropertyInfo> props; + ProjectSettings::get_singleton()->get_property_list(&props); + + const Ref<Texture2D> builtin_icon = get_theme_icon("PinPressed", "EditorIcons"); + for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) { + const String property_name = E->get().name; + + if (!property_name.begins_with("input/")) { + continue; + } + + // Strip the "input/" from the left. + String display_name = property_name.substr(String("input/").size() - 1); + Dictionary action = ProjectSettings::get_singleton()->get(property_name); + + ActionMapEditor::ActionInfo action_info; + action_info.action = action; + action_info.editable = true; + action_info.name = display_name; + + const bool is_builtin_input = ProjectSettings::get_singleton()->get_input_presets().find(property_name) != nullptr; + if (is_builtin_input) { + action_info.editable = false; + action_info.icon = builtin_icon; + } + + actions.push_back(action_info); + } + + action_map->update_action_list(actions); +} + 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")); @@ -292,6 +491,8 @@ void ProjectSettingsEditor::_notification(int p_what) { 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")); + + _update_action_map_editor(); } break; case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { search_box->set_right_icon(get_theme_icon("Search", "EditorIcons")); @@ -302,6 +503,8 @@ void ProjectSettingsEditor::_notification(int p_what) { void ProjectSettingsEditor::_bind_methods() { ClassDB::bind_method(D_METHOD("queue_save"), &ProjectSettingsEditor::queue_save); + + ClassDB::bind_method(D_METHOD("_update_action_map_editor"), &ProjectSettingsEditor::_update_action_map_editor); } ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { @@ -339,23 +542,19 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { search_bar->add_child(search_box); advanced = memnew(CheckButton); - advanced->set_text(TTR("Advanced")); + advanced->set_text(TTR("Advanced Settings")); advanced->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_advanced_pressed)); search_bar->add_child(advanced); } { // Advanced bar. - advanced_bar = memnew(VBoxContainer); - advanced_bar->set_h_size_flags(Control::SIZE_EXPAND_FILL); + advanced_bar = memnew(HBoxContainer); advanced_bar->hide(); header->add_child(advanced_bar); - advanced_bar->add_child(memnew(HSeparator)); - - HBoxContainer *hbc = memnew(HBoxContainer); + HBoxContainer *hbc = advanced_bar; 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); @@ -364,7 +563,7 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { hbc->add_child(category_box); Label *l = memnew(Label); - l->set_text("/"); + l->set_text(" / "); hbc->add_child(l); property_box = memnew(LineEdit); @@ -407,9 +606,6 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { del_button->set_flat(true); del_button->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_delete_setting), varray(false)); hbc->add_child(del_button); - - error_label = memnew(Label); - advanced_bar->add_child(error_label); } inspector = memnew(SectionedInspector); @@ -447,10 +643,16 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { restart_close_button->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_editor_restart_close)); restart_hb->add_child(restart_close_button); - inputmap_editor = memnew(InputMapEditor); - inputmap_editor->set_name(TTR("Input Map")); - inputmap_editor->connect("inputmap_changed", callable_mp(this, &ProjectSettingsEditor::queue_save)); - tab_container->add_child(inputmap_editor); + action_map = memnew(ActionMapEditor); + action_map->set_name(TTR("Input Map")); + action_map->connect("action_added", callable_mp(this, &ProjectSettingsEditor::_action_added)); + action_map->connect("action_edited", callable_mp(this, &ProjectSettingsEditor::_action_edited)); + action_map->connect("action_removed", callable_mp(this, &ProjectSettingsEditor::_action_removed)); + action_map->connect("action_renamed", callable_mp(this, &ProjectSettingsEditor::_action_renamed)); + action_map->connect("action_reordered", callable_mp(this, &ProjectSettingsEditor::_action_reordered)); + action_map->set_toggle_editable_label(TTR("Show Built-in Actions")); + action_map->set_show_uneditable(false); + tab_container->add_child(action_map); localization_editor = memnew(LocalizationEditor); localization_editor->set_name(TTR("Localization")); @@ -483,4 +685,18 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { get_ok_button()->set_text(TTR("Close")); set_hide_on_ok(true); + + bool use_advanced = EditorSettings::get_singleton()->get_project_metadata("project_settings", "advanced_mode", false); + + if (use_advanced) { + advanced->set_pressed(true); + advanced_bar->show(); + } + + inspector->set_restrict_to_basic_settings(!use_advanced); + + import_defaults_editor = memnew(ImportDefaultsEditor); + import_defaults_editor->set_name(TTR("Import Defaults")); + tab_container->add_child(import_defaults_editor); + import_defaults_editor->connect("project_settings_changed", callable_mp(this, &ProjectSettingsEditor::queue_save)); } diff --git a/editor/project_settings_editor.h b/editor/project_settings_editor.h index 88c96540ff..cde46ac4c4 100644 --- a/editor/project_settings_editor.h +++ b/editor/project_settings_editor.h @@ -32,10 +32,11 @@ #define PROJECT_SETTINGS_EDITOR_H #include "core/object/undo_redo.h" +#include "editor/action_map_editor.h" #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/import_defaults_editor.h" #include "editor/localization_editor.h" #include "editor/shader_globals_editor.h" #include "editor_autoload_settings.h" @@ -44,38 +45,29 @@ class ProjectSettingsEditor : public AcceptDialog { GDCLASS(ProjectSettingsEditor, AcceptDialog); - enum InputType { - INPUT_KEY, - INPUT_KEY_PHYSICAL, - INPUT_JOY_BUTTON, - INPUT_JOY_MOTION, - INPUT_MOUSE_BUTTON - }; - static ProjectSettingsEditor *singleton; ProjectSettings *ps; Timer *timer; TabContainer *tab_container; SectionedInspector *inspector; - InputMapEditor *inputmap_editor; LocalizationEditor *localization_editor; EditorAutoloadSettings *autoload_settings; ShaderGlobalsEditor *shaders_global_variables_editor; EditorPluginSettings *plugin_settings; + ActionMapEditor *action_map; HBoxContainer *search_bar; LineEdit *search_box; CheckButton *advanced; - VBoxContainer *advanced_bar; + HBoxContainer *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; @@ -84,6 +76,7 @@ class ProjectSettingsEditor : public AcceptDialog { PanelContainer *restart_container; Button *restart_close_button; + ImportDefaultsEditor *import_defaults_editor; EditorData *data; UndoRedo *undo_redo; @@ -103,6 +96,14 @@ class ProjectSettingsEditor : public AcceptDialog { void _editor_restart_close(); void _add_feature_overrides(); + + void _action_added(const String &p_name); + void _action_edited(const String &p_name, const Dictionary &p_action); + void _action_removed(const String &p_name); + void _action_renamed(const String &p_old_name, const String &p_new_name); + void _action_reordered(const String &p_action_name, const String &p_relative_to, bool p_before); + void _update_action_map_editor(); + ProjectSettingsEditor(); protected: diff --git a/editor/property_editor.cpp b/editor/property_editor.cpp index 07312e42b4..0a4f432e4a 100644 --- a/editor/property_editor.cpp +++ b/editor/property_editor.cpp @@ -417,7 +417,12 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant:: updating = false; return false; - } else if (hint == PROPERTY_HINT_LAYERS_2D_PHYSICS || hint == PROPERTY_HINT_LAYERS_2D_RENDER || hint == PROPERTY_HINT_LAYERS_3D_PHYSICS || hint == PROPERTY_HINT_LAYERS_3D_RENDER) { + } else if (hint == PROPERTY_HINT_LAYERS_2D_PHYSICS || + hint == PROPERTY_HINT_LAYERS_2D_RENDER || + hint == PROPERTY_HINT_LAYERS_2D_NAVIGATION || + hint == PROPERTY_HINT_LAYERS_3D_PHYSICS || + hint == PROPERTY_HINT_LAYERS_3D_RENDER || + hint == PROPERTY_HINT_LAYERS_3D_NAVIGATION) { String basename; switch (hint) { case PROPERTY_HINT_LAYERS_2D_RENDER: @@ -426,12 +431,18 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant:: case PROPERTY_HINT_LAYERS_2D_PHYSICS: basename = "layer_names/2d_physics"; break; + case PROPERTY_HINT_LAYERS_2D_NAVIGATION: + basename = "layer_names/2d_navigation"; + break; case PROPERTY_HINT_LAYERS_3D_RENDER: basename = "layer_names/3d_render"; break; case PROPERTY_HINT_LAYERS_3D_PHYSICS: basename = "layer_names/3d_physics"; break; + case PROPERTY_HINT_LAYERS_3D_NAVIGATION: + basename = "layer_names/3d_navigation"; + break; } checks20gc->show(); @@ -1153,7 +1164,12 @@ void CustomPropertyEditor::_action_pressed(int p_which) { emit_signal("variant_changed"); } break; case Variant::INT: { - if (hint == PROPERTY_HINT_LAYERS_2D_PHYSICS || hint == PROPERTY_HINT_LAYERS_2D_RENDER || hint == PROPERTY_HINT_LAYERS_3D_PHYSICS || hint == PROPERTY_HINT_LAYERS_3D_RENDER) { + if (hint == PROPERTY_HINT_LAYERS_2D_PHYSICS || + hint == PROPERTY_HINT_LAYERS_2D_RENDER || + hint == PROPERTY_HINT_LAYERS_2D_NAVIGATION || + hint == PROPERTY_HINT_LAYERS_3D_PHYSICS || + hint == PROPERTY_HINT_LAYERS_3D_RENDER || + hint == PROPERTY_HINT_LAYERS_3D_NAVIGATION) { uint32_t f = v; if (checks20[p_which]->is_pressed()) { f |= (1 << p_which); @@ -1337,7 +1353,7 @@ void CustomPropertyEditor::_action_pressed(int p_which) { void CustomPropertyEditor::_drag_easing(const Ref<InputEvent> &p_ev) { Ref<InputEventMouseMotion> mm = p_ev; - if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT) { + if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) { float rel = mm->get_relative().x; if (rel == 0) { return; diff --git a/editor/rename_dialog.cpp b/editor/rename_dialog.cpp index 48aa0471c9..b51524b299 100644 --- a/editor/rename_dialog.cpp +++ b/editor/rename_dialog.cpp @@ -434,7 +434,10 @@ String RenameDialog::_substitute(const String &subject, const Node *node, int co } int current = EditorNode::get_singleton()->get_editor_data().get_edited_scene(); - result = result.replace("${SCENE}", EditorNode::get_singleton()->get_editor_data().get_scene_title(current)); + // Always request the scene title with the extension stripped. + // Otherwise, the result could vary depending on whether a scene with the same name + // (but different extension) is currently open. + result = result.replace("${SCENE}", EditorNode::get_singleton()->get_editor_data().get_scene_title(current, true)); Node *root_node = SceneTree::get_singleton()->get_edited_scene_root(); if (root_node) { diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index ac1beb1c37..023019b2aa 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -63,7 +63,7 @@ void SceneTreeDock::_quick_open() { void SceneTreeDock::_input(Ref<InputEvent> p_event) { Ref<InputEventMouseButton> mb = p_event; - if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { + if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) { restore_script_editor_on_drag = false; //lost chance } } @@ -87,6 +87,12 @@ void SceneTreeDock::_unhandled_key_input(Ref<InputEvent> p_event) { _tool_selected(TOOL_INSTANCE); } else if (ED_IS_SHORTCUT("scene_tree/expand_collapse_all", p_event)) { _tool_selected(TOOL_EXPAND_COLLAPSE); + } else if (ED_IS_SHORTCUT("scene_tree/cut_node", p_event)) { + _tool_selected(TOOL_CUT); + } else if (ED_IS_SHORTCUT("scene_tree/copy_node", p_event)) { + _tool_selected(TOOL_COPY); + } else if (ED_IS_SHORTCUT("scene_tree/paste_node", p_event)) { + _tool_selected(TOOL_PASTE); } else if (ED_IS_SHORTCUT("scene_tree/change_node_type", p_event)) { _tool_selected(TOOL_REPLACE); } else if (ED_IS_SHORTCUT("scene_tree/duplicate", p_event)) { @@ -101,8 +107,6 @@ void SceneTreeDock::_unhandled_key_input(Ref<InputEvent> p_event) { _tool_selected(TOOL_MOVE_DOWN); } else if (ED_IS_SHORTCUT("scene_tree/reparent", p_event)) { _tool_selected(TOOL_REPARENT); - } else if (ED_IS_SHORTCUT("scene_tree/merge_from_scene", p_event)) { - _tool_selected(TOOL_MERGE_FROM_SCENE); } else if (ED_IS_SHORTCUT("scene_tree/save_branch_as_scene", p_event)) { _tool_selected(TOOL_NEW_SCENE_FROM); } else if (ED_IS_SHORTCUT("scene_tree/delete_no_confirm", p_event)) { @@ -215,6 +219,9 @@ void SceneTreeDock::_perform_instance_scenes(const Vector<String> &p_files, Node editor_data->get_undo_redo().commit_action(); editor->push_item(instances[instances.size() - 1]); + for (int i = 0; i < instances.size(); i++) { + emit_signal("node_created", instances[i]); + } } void SceneTreeDock::_replace_with_branch_scene(const String &p_file, Node *base) { @@ -343,6 +350,11 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { break; } + if (reset_create_dialog) { + create_dialog->set_base_type("Node"); + reset_create_dialog = false; + } + // Prefer nodes that inherit from the current scene root. Node *current_edited_scene_root = EditorNode::get_singleton()->get_edited_scene(); if (current_edited_scene_root) { @@ -363,6 +375,9 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { } create_dialog->popup_create(true); + if (!p_confirm_override) { + emit_signal("add_node_used"); + } } break; case TOOL_INSTANCE: { if (!profile_allow_editing) { @@ -377,7 +392,9 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { quick_open->popup_dialog("PackedScene", true); quick_open->set_title(TTR("Instance Child Scene")); - + if (!p_confirm_override) { + emit_signal("add_node_used"); + } } break; case TOOL_EXPAND_COLLAPSE: { if (!scene_tree->get_selected()) { @@ -397,11 +414,127 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { tree->ensure_cursor_is_visible(); } break; + case TOOL_CUT: + case TOOL_COPY: { + if (!edited_scene || !_validate_no_foreign()) { + break; + } + + List<Node *> selection = editor_selection->get_selected_node_list(); + if (selection.size() == 0) { + break; + } + + if (!node_clipboard.is_empty()) { + _clear_clipboard(); + } + clipboard_source_scene = editor->get_edited_scene()->get_filename(); + + selection.sort_custom<Node::Comparator>(); + + for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { + Node *node = E->get(); + Map<const Node *, Node *> duplimap; + Node *dup = node->duplicate_from_editor(duplimap); + + ERR_CONTINUE(!dup); + + node_clipboard.push_back(dup); + } + + if (p_tool == TOOL_CUT) { + _delete_confirm(true); + } + } break; + case TOOL_PASTE: { + if (node_clipboard.is_empty() || !edited_scene) { + break; + } + + bool has_cycle = false; + if (edited_scene->get_filename() != String()) { + for (List<Node *>::Element *E = node_clipboard.front(); E; E = E->next()) { + if (edited_scene->get_filename() == E->get()->get_filename()) { + has_cycle = true; + break; + } + } + } + + if (has_cycle) { + current_option = -1; + accept->set_text(TTR("Can't paste root node into the same scene.")); + accept->popup_centered(); + break; + } + + Node *paste_parent = edited_scene; + List<Node *> selection = editor_selection->get_selected_node_list(); + if (selection.size() > 0) { + paste_parent = selection.back()->get(); + } + + Node *owner = paste_parent->get_owner(); + if (!owner) { + owner = paste_parent; + } + + editor_data->get_undo_redo().create_action(TTR("Paste Node(s)")); + editor_data->get_undo_redo().add_do_method(editor_selection, "clear"); + + Map<RES, RES> resource_remap; + String target_scene = editor->get_edited_scene()->get_filename(); + if (target_scene != clipboard_source_scene) { + if (!clipboard_resource_remap.has(target_scene)) { + Map<RES, RES> remap; + for (List<Node *>::Element *E = node_clipboard.front(); E; E = E->next()) { + _create_remap_for_node(E->get(), remap); + } + clipboard_resource_remap[target_scene] = remap; + } + resource_remap = clipboard_resource_remap[target_scene]; + } + + for (List<Node *>::Element *E = node_clipboard.front(); E; E = E->next()) { + Node *node = E->get(); + Map<const Node *, Node *> duplimap; + + Node *dup = node->duplicate_from_editor(duplimap, resource_remap); + + ERR_CONTINUE(!dup); + + editor_data->get_undo_redo().add_do_method(paste_parent, "add_child", dup); + + for (Map<const Node *, Node *>::Element *E2 = duplimap.front(); E2; E2 = E2->next()) { + Node *d = E2->value(); + editor_data->get_undo_redo().add_do_method(d, "set_owner", owner); + } + + editor_data->get_undo_redo().add_do_method(dup, "set_owner", owner); + editor_data->get_undo_redo().add_do_method(editor_selection, "add_node", dup); + editor_data->get_undo_redo().add_undo_method(paste_parent, "remove_child", dup); + editor_data->get_undo_redo().add_do_reference(dup); + + if (node_clipboard.size() == 1) { + editor_data->get_undo_redo().add_do_method(editor, "push_item", dup); + } + } + + editor_data->get_undo_redo().commit_action(); + } break; case TOOL_REPLACE: { if (!profile_allow_editing) { break; } + if (!_validate_no_foreign()) { + break; + } + + if (!_validate_no_instance()) { + break; + } + Node *selected = scene_tree->get_selected(); if (!selected && !editor_selection->get_selected_node_list().is_empty()) { selected = editor_selection->get_selected_node_list().front()->get(); @@ -552,7 +685,6 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { editor_data->get_undo_redo().add_do_method(editor_selection, "clear"); Node *dupsingle = nullptr; - List<Node *> editable_children; selection.sort_custom<Node::Comparator>(); @@ -568,10 +700,6 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { Map<const Node *, Node *> duplimap; Node *dup = node->duplicate_from_editor(duplimap); - if (EditorNode::get_singleton()->get_edited_scene()->is_editable_instance(node)) { - editable_children.push_back(dup); - } - ERR_CONTINUE(!dup); if (selection.size() == 1) { @@ -606,11 +734,6 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { if (dupsingle) { editor->push_item(dupsingle); } - - for (List<Node *>::Element *E = editable_children.back(); E; E = E->prev()) { - _toggle_editable_children(E->get()); - } - } break; case TOOL_REPARENT: { if (!profile_allow_editing) { @@ -766,13 +889,6 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { } } break; - case TOOL_MERGE_FROM_SCENE: { - if (!profile_allow_editing) { - break; - } - - EditorNode::get_singleton()->merge_from_scene(); - } break; case TOOL_NEW_SCENE_FROM: { if (!profile_allow_editing) { break; @@ -781,7 +897,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { Node *scene = editor_data->get_edited_scene_root(); if (!scene) { - accept->set_text(TTR("This operation can't be done without a scene.")); + accept->set_text(TTR("Saving the branch as a scene requires having a scene open in the editor.")); accept->popup_centered(); break; } @@ -789,7 +905,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { List<Node *> selection = editor_selection->get_selected_node_list(); if (selection.size() != 1) { - accept->set_text(TTR("This operation requires a single selected node.")); + accept->set_text(vformat(TTR("Saving the branch as a scene requires selecting only one node, but you have selected %d nodes."), selection.size())); accept->popup_centered(); break; } @@ -797,13 +913,13 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { Node *tocopy = selection.front()->get(); if (tocopy == scene) { - accept->set_text(TTR("Can not perform with the root node.")); + accept->set_text(TTR("Can't save the root node branch as an instanced scene.\nTo create an editable copy of the current scene, duplicate it using the FileSystem dock context menu\nor create an inherited scene using Scene > New Inherited Scene... instead.")); accept->popup_centered(); break; } if (tocopy != editor_data->get_edited_scene_root() && tocopy->get_filename() != "") { - accept->set_text(TTR("This operation can't be done on instanced scenes.")); + accept->set_text(TTR("Can't save the branch of an already instanced scene.\nTo create a variation of a scene, you can make an inherited scene based on the instanced scene using Scene > New Inherited Scene... instead.")); accept->popup_centered(); break; } @@ -1510,6 +1626,20 @@ bool SceneTreeDock::_validate_no_foreign() { return true; } +bool SceneTreeDock::_validate_no_instance() { + List<Node *> selection = editor_selection->get_selected_node_list(); + + for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { + if (E->get() != edited_scene && E->get()->get_filename() != "") { + accept->set_text(TTR("This operation can't be done on instanced scenes.")); + accept->popup_centered(); + return false; + } + } + + return true; +} + void SceneTreeDock::_node_reparent(NodePath p_path, bool p_keep_global_xform) { Node *new_parent = scene_root->get_node(p_path); ERR_FAIL_COND(!new_parent); @@ -1795,7 +1925,7 @@ void SceneTreeDock::_toggle_editable_children(Node *p_node) { } } -void SceneTreeDock::_delete_confirm() { +void SceneTreeDock::_delete_confirm(bool p_cut) { List<Node *> remove_list = editor_selection->get_selected_node_list(); if (remove_list.is_empty()) { @@ -1804,7 +1934,11 @@ void SceneTreeDock::_delete_confirm() { editor->get_editor_plugins_over()->make_visible(false); - editor_data->get_undo_redo().create_action(TTR("Remove Node(s)")); + if (p_cut) { + editor_data->get_undo_redo().create_action(TTR("Cut Node(s)")); + } else { + editor_data->get_undo_redo().create_action(TTR("Remove Node(s)")); + } bool entire_scene = false; @@ -1970,6 +2104,8 @@ void SceneTreeDock::_do_create(Node *p_parent) { } ct->set_size(ms); } + + emit_signal("node_created", c); } void SceneTreeDock::_create() { @@ -2173,21 +2309,6 @@ void SceneTreeDock::set_selected(Node *p_node, bool p_emit_selected) { scene_tree->set_selected(p_node, p_emit_selected); } -void SceneTreeDock::import_subscene() { - import_subscene_dialog->popup_centered_clamped(Size2(500, 800) * EDSCALE, 0.8); -} - -void SceneTreeDock::_import_subscene() { - Node *parent = scene_tree->get_selected(); - if (!parent) { - parent = editor_data->get_edited_scene_root(); - ERR_FAIL_COND(!parent); - } - - import_subscene_dialog->move(parent, edited_scene); - editor_data->get_undo_redo().clear_history(); //no undo for now.. -} - void SceneTreeDock::_new_scene_from(String p_file) { List<Node *> selection = editor_selection->get_selected_node_list(); @@ -2205,10 +2326,14 @@ void SceneTreeDock::_new_scene_from(String p_file) { Node *base = selection.front()->get(); - Map<Node *, Node *> reown; - reown[editor_data->get_edited_scene_root()] = base; - Node *copy = base->duplicate_and_reown(reown); + Map<const Node *, Node *> duplimap; + Node *copy = base->duplicate_from_editor(duplimap); + if (copy) { + for (int i = 0; i < copy->get_child_count(); i++) { + _set_node_owner_recursive(copy->get_child(i), copy); + } + Ref<PackedScene> sdata = memnew(PackedScene); Error err = sdata->pack(copy); memdelete(copy); @@ -2238,6 +2363,16 @@ void SceneTreeDock::_new_scene_from(String p_file) { } } +void SceneTreeDock::_set_node_owner_recursive(Node *p_node, Node *p_owner) { + if (!p_node->get_owner()) { + p_node->set_owner(p_owner); + } + + for (int i = 0; i < p_node->get_child_count(); i++) { + _set_node_owner_recursive(p_node->get_child(i), p_owner); + } +} + static bool _is_node_visible(Node *p_node) { if (!p_node->get_owner()) { return false; @@ -2444,6 +2579,13 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) { } if (profile_allow_script_editing) { + menu->add_shortcut(ED_GET_SHORTCUT("scene_tree/cut_node"), TOOL_CUT); + menu->add_shortcut(ED_GET_SHORTCUT("scene_tree/copy_node"), TOOL_COPY); + if (selection.size() == 1 && !node_clipboard.is_empty()) { + menu->add_shortcut(ED_GET_SHORTCUT("scene_tree/paste_node"), TOOL_PASTE); + } + menu->add_separator(); + bool add_separator = false; if (full_selection.size() == 1) { @@ -2480,7 +2622,18 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) { if (full_selection.size() == 1) { menu->add_icon_shortcut(get_theme_icon("Rename", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/rename"), TOOL_RENAME); } - menu->add_icon_shortcut(get_theme_icon("Reload", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/change_node_type"), TOOL_REPLACE); + + bool can_replace = true; + for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { + if (E->get() != edited_scene && (E->get()->get_owner() != edited_scene || E->get()->get_filename() != "")) { + can_replace = false; + break; + } + } + + if (can_replace) { + menu->add_icon_shortcut(get_theme_icon("Reload", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/change_node_type"), TOOL_REPLACE); + } if (scene_tree->get_selected() != edited_scene) { menu->add_separator(); @@ -2497,7 +2650,6 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) { if (selection.size() == 1) { if (profile_allow_editing) { menu->add_separator(); - menu->add_icon_shortcut(get_theme_icon("Blend", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/merge_from_scene"), TOOL_MERGE_FROM_SCENE); menu->add_icon_shortcut(get_theme_icon("CreateNewSceneFrom", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/save_branch_as_scene"), TOOL_NEW_SCENE_FROM); } if (full_selection.size() == 1) { @@ -2643,6 +2795,16 @@ void SceneTreeDock::open_script_dialog(Node *p_for_node, bool p_extend) { } } +void SceneTreeDock::open_add_child_dialog() { + create_dialog->set_base_type("CanvasItem"); + _tool_selected(TOOL_NEW, true); + reset_create_dialog = true; +} + +void SceneTreeDock::open_instance_child_dialog() { + _tool_selected(TOOL_INSTANCE, true); +} + void SceneTreeDock::add_remote_tree_editor(Control *p_remote) { ERR_FAIL_COND(remote_tree != nullptr); add_child(p_remote); @@ -2775,6 +2937,62 @@ void SceneTreeDock::_feature_profile_changed() { _update_script_button(); } +void SceneTreeDock::_clear_clipboard() { + for (List<Node *>::Element *E = node_clipboard.front(); E; E = E->next()) { + memdelete(E->get()); + } + node_clipboard.clear(); + clipboard_resource_remap.clear(); +} + +void SceneTreeDock::_create_remap_for_node(Node *p_node, Map<RES, RES> &r_remap) { + List<PropertyInfo> props; + p_node->get_property_list(&props); + + for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) { + if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) { + continue; + } + + Variant v = p_node->get(E->get().name); + if (v.is_ref()) { + RES res = v; + if (res.is_valid()) { + if ((res->get_path() == "" || res->get_path().find("::") > -1) && !r_remap.has(res)) { + _create_remap_for_resource(res, r_remap); + } + } + } + } + + for (int i = 0; i < p_node->get_child_count(); i++) { + _create_remap_for_node(p_node->get_child(i), r_remap); + } +} + +void SceneTreeDock::_create_remap_for_resource(RES p_resource, Map<RES, RES> &r_remap) { + r_remap[p_resource] = p_resource->duplicate(); + + List<PropertyInfo> props; + p_resource->get_property_list(&props); + + for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) { + if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) { + continue; + } + + Variant v = p_resource->get(E->get().name); + if (v.is_ref()) { + RES res = v; + if (res.is_valid()) { + if ((res->get_path() == "" || res->get_path().find("::") > -1) && !r_remap.has(res)) { + _create_remap_for_resource(res, r_remap); + } + } + } + } +} + void SceneTreeDock::_bind_methods() { ClassDB::bind_method(D_METHOD("_set_owners"), &SceneTreeDock::_set_owners); ClassDB::bind_method(D_METHOD("_unhandled_key_input"), &SceneTreeDock::_unhandled_key_input); @@ -2786,6 +3004,8 @@ void SceneTreeDock::_bind_methods() { ClassDB::bind_method(D_METHOD("replace_node"), &SceneTreeDock::replace_node); ADD_SIGNAL(MethodInfo("remote_tree_selected")); + ADD_SIGNAL(MethodInfo("add_node_used")); + ADD_SIGNAL(MethodInfo("node_created", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_RESOURCE_TYPE, "Node"))); } SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSelection *p_editor_selection, EditorData &p_editor_data) { @@ -2806,6 +3026,9 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel ED_SHORTCUT("scene_tree/add_child_node", TTR("Add Child Node"), KEY_MASK_CMD | KEY_A); ED_SHORTCUT("scene_tree/instance_scene", TTR("Instance Child Scene")); ED_SHORTCUT("scene_tree/expand_collapse_all", TTR("Expand/Collapse All")); + ED_SHORTCUT("scene_tree/cut_node", TTR("Cut"), KEY_MASK_CMD | KEY_X); + ED_SHORTCUT("scene_tree/copy_node", TTR("Copy"), KEY_MASK_CMD | KEY_C); + ED_SHORTCUT("scene_tree/paste_node", TTR("Paste"), KEY_MASK_CMD | KEY_V); ED_SHORTCUT("scene_tree/change_node_type", TTR("Change Type")); ED_SHORTCUT("scene_tree/attach_script", TTR("Attach Script")); ED_SHORTCUT("scene_tree/extend_script", TTR("Extend Script")); @@ -2816,9 +3039,8 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel ED_SHORTCUT("scene_tree/reparent", TTR("Reparent")); ED_SHORTCUT("scene_tree/reparent_to_new_node", TTR("Reparent to New Node")); ED_SHORTCUT("scene_tree/make_root", TTR("Make Scene Root")); - ED_SHORTCUT("scene_tree/merge_from_scene", TTR("Merge From Scene")); ED_SHORTCUT("scene_tree/save_branch_as_scene", TTR("Save Branch as Scene")); - ED_SHORTCUT("scene_tree/copy_node_path", TTR("Copy Node Path"), KEY_MASK_CMD | KEY_C); + ED_SHORTCUT("scene_tree/copy_node_path", TTR("Copy Node Path"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_C); ED_SHORTCUT("scene_tree/delete_no_confirm", TTR("Delete (No Confirm)"), KEY_MASK_SHIFT | KEY_DELETE); ED_SHORTCUT("scene_tree/delete", TTR("Delete"), KEY_DELETE); @@ -2841,7 +3063,7 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel filter->set_h_size_flags(SIZE_EXPAND_FILL); filter->set_placeholder(TTR("Filter nodes")); filter_hbc->add_child(filter); - filter->add_theme_constant_override("minimum_spaces", 0); + filter->add_theme_constant_override("minimum_character_width", 0); filter->connect("text_changed", callable_mp(this, &SceneTreeDock::_filter_changed)); button_create_script = memnew(Button); @@ -2936,7 +3158,7 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel delete_dialog = memnew(ConfirmationDialog); add_child(delete_dialog); - delete_dialog->connect("confirmed", callable_mp(this, &SceneTreeDock::_delete_confirm)); + delete_dialog->connect("confirmed", callable_mp(this, &SceneTreeDock::_delete_confirm), varray(false)); editable_instance_remove_dialog = memnew(ConfirmationDialog); add_child(editable_instance_remove_dialog); @@ -2946,10 +3168,6 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel add_child(placeholder_editable_instance_remove_dialog); placeholder_editable_instance_remove_dialog->connect("confirmed", callable_mp(this, &SceneTreeDock::_toggle_placeholder_from_selection)); - import_subscene_dialog = memnew(EditorSubScene); - add_child(import_subscene_dialog); - import_subscene_dialog->connect("subscene_selected", callable_mp(this, &SceneTreeDock::_import_subscene)); - new_scene_from_dialog = memnew(EditorFileDialog); new_scene_from_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE); add_child(new_scene_from_dialog); @@ -2981,3 +3199,9 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel EDITOR_DEF("interface/editors/derive_script_globals_by_name", true); EDITOR_DEF("_use_favorites_root_selection", false); } + +SceneTreeDock::~SceneTreeDock() { + if (!node_clipboard.is_empty()) { + _clear_clipboard(); + } +} diff --git a/editor/scene_tree_dock.h b/editor/scene_tree_dock.h index 4f8d85f07c..aa62c93cb5 100644 --- a/editor/scene_tree_dock.h +++ b/editor/scene_tree_dock.h @@ -34,7 +34,6 @@ #include "editor/connections_dialog.h" #include "editor/create_dialog.h" #include "editor/editor_data.h" -#include "editor/editor_sub_scene.h" #include "editor/groups_editor.h" #include "editor/quick_open.h" #include "editor/rename_dialog.h" @@ -58,6 +57,9 @@ class SceneTreeDock : public VBoxContainer { TOOL_NEW, TOOL_INSTANCE, TOOL_EXPAND_COLLAPSE, + TOOL_CUT, + TOOL_COPY, + TOOL_PASTE, TOOL_RENAME, TOOL_BATCH_RENAME, TOOL_REPLACE, @@ -71,7 +73,6 @@ class SceneTreeDock : public VBoxContainer { TOOL_REPARENT_TO_NEW_NODE, TOOL_MAKE_ROOT, TOOL_NEW_SCENE_FROM, - TOOL_MERGE_FROM_SCENE, TOOL_MULTI_EDIT, TOOL_ERASE, TOOL_COPY_NODE_PATH, @@ -99,6 +100,7 @@ class SceneTreeDock : public VBoxContainer { Vector<ObjectID> subresources; bool restore_script_editor_on_drag; + bool reset_create_dialog = false; int current_option; CreateDialog *create_dialog; @@ -126,6 +128,10 @@ class SceneTreeDock : public VBoxContainer { EditorData *editor_data; EditorSelection *editor_selection; + List<Node *> node_clipboard; + String clipboard_source_scene; + HashMap<String, Map<RES, RES>> clipboard_resource_remap; + ScriptCreateDialog *script_create_dialog; AcceptDialog *accept; ConfirmationDialog *delete_dialog; @@ -134,7 +140,6 @@ class SceneTreeDock : public VBoxContainer { ReparentDialog *reparent_dialog; EditorQuickOpen *quick_open; - EditorSubScene *import_subscene_dialog; EditorFileDialog *new_scene_from_dialog; LineEdit *filter; @@ -183,7 +188,7 @@ class SceneTreeDock : public VBoxContainer { void _script_created(Ref<Script> p_script); void _script_creation_closed(); - void _delete_confirm(); + void _delete_confirm(bool p_cut = false); void _toggle_editable_children_from_selection(); void _toggle_editable_children(Node *p_node); @@ -199,8 +204,10 @@ class SceneTreeDock : public VBoxContainer { void _import_subscene(); void _new_scene_from(String p_file); + void _set_node_owner_recursive(Node *p_node, Node *p_owner); bool _validate_no_foreign(); + bool _validate_no_instance(); void _selection_changed(); void _update_script_button(); @@ -230,6 +237,10 @@ class SceneTreeDock : public VBoxContainer { void _feature_profile_changed(); + void _clear_clipboard(); + void _create_remap_for_node(Node *p_node, Map<RES, RES> &r_remap); + void _create_remap_for_resource(RES p_resource, Map<RES, RES> &r_remap); + bool profile_allow_editing; bool profile_allow_script_editing; @@ -264,9 +275,13 @@ public: void attach_script_to_selected(bool p_extend); void open_script_dialog(Node *p_for_node, bool p_extend); + void open_add_child_dialog(); + void open_instance_child_dialog(); + ScriptCreateDialog *get_script_create_dialog() { return script_create_dialog; } SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSelection *p_editor_selection, EditorData &p_editor_data); + ~SceneTreeDock(); }; #endif // SCENE_TREE_DOCK_H diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp index b8475656ee..b5e9aec854 100644 --- a/editor/scene_tree_editor.cpp +++ b/editor/scene_tree_editor.cpp @@ -156,7 +156,7 @@ void SceneTreeEditor::_toggle_visible(Node *p_node) { } } -bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) { +bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent, bool p_scroll_to_selected) { if (!p_node) { return false; } @@ -236,6 +236,8 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) { item->set_text(0, node_name); item->set_selectable(0, marked_selectable); item->set_custom_color(0, get_theme_color("accent_color", "Editor")); + } else if (!p_node->can_process()) { + item->set_custom_color(0, get_theme_color("disabled_font_color", "Editor")); } else if (!marked_selectable && !marked_children_selectable) { Node *node = p_node; while (node) { @@ -391,15 +393,19 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) { } } + bool scroll = false; + if (editor_selection) { if (editor_selection->is_selected(p_node)) { item->select(0); + scroll = p_scroll_to_selected; } } if (selected == p_node) { if (!editor_selection) { item->select(0); + scroll = p_scroll_to_selected; } item->set_as_cursor(0); } @@ -407,7 +413,7 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) { bool keep = (filter.is_subsequence_ofi(String(p_node->get_name()))); for (int i = 0; i < p_node->get_child_count(); i++) { - bool child_keep = _add_nodes(p_node->get_child(i), item); + bool child_keep = _add_nodes(p_node->get_child(i), item, p_scroll_to_selected); keep = keep || child_keep; } @@ -438,6 +444,9 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) { memdelete(item); return false; } else { + if (scroll) { + tree->scroll_to_item(item); + } return true; } } @@ -525,7 +534,7 @@ void SceneTreeEditor::_node_renamed(Node *p_node) { } } -void SceneTreeEditor::_update_tree() { +void SceneTreeEditor::_update_tree(bool p_scroll_to_selected) { if (!is_inside_tree()) { tree_dirty = false; return; @@ -534,7 +543,7 @@ void SceneTreeEditor::_update_tree() { updating_tree = true; tree->clear(); if (get_scene_node()) { - _add_nodes(get_scene_node(), nullptr); + _add_nodes(get_scene_node(), nullptr, p_scroll_to_selected); last_hash = hash_djb2_one_64(0); _compute_hash(get_scene_node(), last_hash); } @@ -578,6 +587,11 @@ void SceneTreeEditor::_test_update_tree() { tree_dirty = true; } +void SceneTreeEditor::_tree_process_mode_changed() { + MessageQueue::get_singleton()->push_call(this, "_update_tree"); + tree_dirty = true; +} + void SceneTreeEditor::_tree_changed() { if (EditorNode::get_singleton()->is_exiting()) { return; //speed up exit @@ -612,7 +626,7 @@ void SceneTreeEditor::_selected_changed() { } void SceneTreeEditor::_deselect_items() { - // Clear currently elected items in scene tree dock. + // Clear currently selected items in scene tree dock. if (editor_selection) { editor_selection->clear(); emit_signal("node_changed"); @@ -648,6 +662,7 @@ void SceneTreeEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { get_tree()->connect("tree_changed", callable_mp(this, &SceneTreeEditor::_tree_changed)); + get_tree()->connect("tree_process_mode_changed", callable_mp(this, &SceneTreeEditor::_tree_process_mode_changed)); get_tree()->connect("node_removed", callable_mp(this, &SceneTreeEditor::_node_removed)); get_tree()->connect("node_renamed", callable_mp(this, &SceneTreeEditor::_node_renamed)); get_tree()->connect("node_configuration_warning_changed", callable_mp(this, &SceneTreeEditor::_warning_changed)); @@ -658,6 +673,7 @@ void SceneTreeEditor::_notification(int p_what) { } break; case NOTIFICATION_EXIT_TREE: { get_tree()->disconnect("tree_changed", callable_mp(this, &SceneTreeEditor::_tree_changed)); + get_tree()->disconnect("tree_process_mode_changed", callable_mp(this, &SceneTreeEditor::_tree_process_mode_changed)); get_tree()->disconnect("node_removed", callable_mp(this, &SceneTreeEditor::_node_removed)); get_tree()->disconnect("node_renamed", callable_mp(this, &SceneTreeEditor::_node_renamed)); tree->disconnect("item_collapsed", callable_mp(this, &SceneTreeEditor::_cell_collapsed)); @@ -760,9 +776,11 @@ void SceneTreeEditor::_renamed() { return; } - String new_name = which->get_text(0); - if (!Node::_validate_node_name(new_name)) { - error->set_text(TTR("Invalid node name, the following characters are not allowed:") + "\n" + Node::invalid_character); + String raw_new_name = which->get_text(0); + String new_name = raw_new_name.validate_node_name(); + + if (new_name != raw_new_name) { + error->set_text(TTR("Invalid node name, the following characters are not allowed:") + "\n" + String::invalid_node_name_characters); error->popup_centered(); if (new_name.is_empty()) { @@ -817,7 +835,7 @@ void SceneTreeEditor::set_marked(Node *p_marked, bool p_selectable, bool p_child void SceneTreeEditor::set_filter(const String &p_filter) { filter = p_filter; - _update_tree(); + _update_tree(true); } String SceneTreeEditor::get_filter() const { @@ -976,9 +994,6 @@ bool SceneTreeEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_d if (!can_rename) { return false; //not editable tree } - if (filter != String()) { - return false; //can't rearrange tree with filter turned on - } Dictionary d = p_data; if (!d.has("type")) { @@ -1031,7 +1046,7 @@ bool SceneTreeEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_d } } - return String(d["type"]) == "nodes"; + return String(d["type"]) == "nodes" && filter == String(); } void SceneTreeEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) { @@ -1103,7 +1118,7 @@ void SceneTreeEditor::set_connecting_signal(bool p_enable) { } void SceneTreeEditor::_bind_methods() { - ClassDB::bind_method("_update_tree", &SceneTreeEditor::_update_tree); // Still used by some connect_compat. + ClassDB::bind_method(D_METHOD("_update_tree", "scroll_to_selected"), &SceneTreeEditor::_update_tree, DEFVAL(false)); // Still used by some connect_compat. ClassDB::bind_method("_rename_node", &SceneTreeEditor::_rename_node); ClassDB::bind_method("_test_update_tree", &SceneTreeEditor::_test_update_tree); @@ -1154,6 +1169,7 @@ SceneTreeEditor::SceneTreeEditor(bool p_label, bool p_can_rename, bool p_can_ope tree->set_anchor(SIDE_BOTTOM, ANCHOR_END); tree->set_begin(Point2(0, p_label ? 18 : 0)); tree->set_end(Point2(0, 0)); + tree->set_allow_reselect(true); tree->add_theme_constant_override("button_margin", 0); add_child(tree); @@ -1187,7 +1203,7 @@ SceneTreeEditor::SceneTreeEditor(bool p_label, bool p_can_rename, bool p_can_ope blocked = 0; update_timer = memnew(Timer); - update_timer->connect("timeout", callable_mp(this, &SceneTreeEditor::_update_tree)); + update_timer->connect("timeout", callable_mp(this, &SceneTreeEditor::_update_tree), varray(false)); update_timer->set_one_shot(true); update_timer->set_wait_time(0.5); add_child(update_timer); @@ -1253,7 +1269,7 @@ SceneTreeDialog::SceneTreeDialog() { filter = memnew(LineEdit); filter->set_h_size_flags(Control::SIZE_EXPAND_FILL); filter->set_placeholder(TTR("Filter nodes")); - filter->add_theme_constant_override("minimum_spaces", 0); + filter->add_theme_constant_override("minimum_character_width", 0); filter->connect("text_changed", callable_mp(this, &SceneTreeDialog::_filter_changed)); vbc->add_child(filter); diff --git a/editor/scene_tree_editor.h b/editor/scene_tree_editor.h index 831723a27c..fd5157f04f 100644 --- a/editor/scene_tree_editor.h +++ b/editor/scene_tree_editor.h @@ -71,10 +71,11 @@ class SceneTreeEditor : public Control { void _compute_hash(Node *p_node, uint64_t &hash); - bool _add_nodes(Node *p_node, TreeItem *p_parent); + bool _add_nodes(Node *p_node, TreeItem *p_parent, bool p_scroll_to_selected = false); void _test_update_tree(); - void _update_tree(); + void _update_tree(bool p_scroll_to_selected = false); void _tree_changed(); + void _tree_process_mode_changed(); void _node_removed(Node *p_node); void _node_renamed(Node *p_node); @@ -180,6 +181,7 @@ protected: public: void popup_scenetree_dialog(); SceneTreeEditor *get_scene_tree() { return tree; } + LineEdit *get_filter_line_edit() { return filter; } SceneTreeDialog(); ~SceneTreeDialog(); }; diff --git a/editor/settings_config_dialog.cpp b/editor/settings_config_dialog.cpp index 1dad3c091d..3852c389c7 100644 --- a/editor/settings_config_dialog.cpp +++ b/editor/settings_config_dialog.cpp @@ -31,6 +31,7 @@ #include "settings_config_dialog.h" #include "core/config/project_settings.h" +#include "core/input/input_map.h" #include "core/os/keyboard.h" #include "editor/debugger/editor_debugger_node.h" #include "editor_file_system.h" @@ -143,7 +144,7 @@ void EditorSettingsDialog::_unhandled_input(const Ref<InputEvent> &p_event) { if (k.is_valid() && k->is_pressed()) { bool handled = false; - if (ED_IS_SHORTCUT("editor/undo", p_event)) { + if (ED_IS_SHORTCUT("ui_undo", p_event)) { String action = undo_redo->get_current_action_name(); if (action != "") { EditorNode::get_log()->add_message("Undo: " + action, EditorLog::MSG_TYPE_EDITOR); @@ -152,7 +153,7 @@ void EditorSettingsDialog::_unhandled_input(const Ref<InputEvent> &p_event) { handled = true; } - if (ED_IS_SHORTCUT("editor/redo", p_event)) { + if (ED_IS_SHORTCUT("ui_redo", p_event)) { undo_redo->redo(); String action = undo_redo->get_current_action_name(); if (action != "") { @@ -184,7 +185,52 @@ void EditorSettingsDialog::_update_icons() { restart_label->add_theme_color_override("font_color", shortcuts->get_theme_color("warning_color", "Editor")); } +void EditorSettingsDialog::_event_config_confirmed() { + Ref<InputEventKey> k = shortcut_editor->get_event(); + if (k.is_null()) { + return; + } + + if (editing_action) { + if (current_action_event_index == -1) { + // Add new event + current_action_events.push_back(k); + } else { + // Edit existing event + current_action_events[current_action_event_index] = k; + } + + _update_builtin_action(current_action, current_action_events); + } else { + k = k->duplicate(); + Ref<Shortcut> current_sc = EditorSettings::get_singleton()->get_shortcut(shortcut_being_edited); + + undo_redo->create_action(TTR("Change Shortcut") + " '" + shortcut_being_edited + "'"); + undo_redo->add_do_method(current_sc.ptr(), "set_shortcut", k); + undo_redo->add_undo_method(current_sc.ptr(), "set_shortcut", current_sc->get_shortcut()); + undo_redo->add_do_method(this, "_update_shortcuts"); + undo_redo->add_undo_method(this, "_update_shortcuts"); + undo_redo->add_do_method(this, "_settings_changed"); + undo_redo->add_undo_method(this, "_settings_changed"); + undo_redo->commit_action(); + } +} + +void EditorSettingsDialog::_update_builtin_action(const String &p_name, const Array &p_events) { + Array old_input_array = EditorSettings::get_singleton()->get_builtin_action_overrides(current_action); + + undo_redo->create_action(TTR("Edit Built-in Action")); + undo_redo->add_do_method(EditorSettings::get_singleton(), "set_builtin_action_override", p_name, p_events); + undo_redo->add_undo_method(EditorSettings::get_singleton(), "set_builtin_action_override", p_name, old_input_array); + undo_redo->add_do_method(this, "_settings_changed"); + undo_redo->add_undo_method(this, "_settings_changed"); + undo_redo->commit_action(); + + _update_shortcuts(); +} + void EditorSettingsDialog::_update_shortcuts() { + // Before clearing the tree, take note of which categories are collapsed so that this state can be maintained when the tree is repopulated. Map<String, bool> collapsed; if (shortcuts->get_root() && shortcuts->get_root()->get_children()) { @@ -192,15 +238,93 @@ void EditorSettingsDialog::_update_shortcuts() { collapsed[item->get_text(0)] = item->is_collapsed(); } } - shortcuts->clear(); - List<String> slist; - EditorSettings::get_singleton()->get_shortcut_list(&slist); TreeItem *root = shortcuts->create_item(); - Map<String, TreeItem *> sections; + // Set up section for Common/Built-in actions + TreeItem *common_section = shortcuts->create_item(root); + + sections["Common"] = common_section; + common_section->set_text(0, TTR("Common")); + if (collapsed.has("Common")) { + common_section->set_collapsed(collapsed["Common"]); + } + common_section->set_custom_bg_color(0, shortcuts->get_theme_color("prop_subsection", "Editor")); + common_section->set_custom_bg_color(1, shortcuts->get_theme_color("prop_subsection", "Editor")); + + // Get the action map for the editor, and add each item to the "Common" section. + OrderedHashMap<StringName, InputMap::Action> action_map = InputMap::get_singleton()->get_action_map(); + for (OrderedHashMap<StringName, InputMap::Action>::Element E = action_map.front(); E; E = E.next()) { + String action_name = E.key(); + + if (!shortcut_filter.is_subsequence_ofi(action_name)) { + continue; + } + + InputMap::Action action = E.get(); + + Array events; // Need to get the list of events into an array so it can be set as metadata on the item. + Vector<String> event_strings; + + List<Ref<InputEvent>> defaults = InputMap::get_singleton()->get_builtins().find(action_name).value(); + // Remove all non-key events from the defaults. + for (List<Ref<InputEvent>>::Element *I = defaults.front(); I; I = I->next()) { + Ref<InputEventKey> k = I->get(); + if (k.is_null()) { + I->erase(); + } + } + + bool same_as_defaults = defaults.size() == action.inputs.size(); // Initially this is set to just whether the arrays are equal. Later we check the events if needed. + + int count = 0; + for (List<Ref<InputEvent>>::Element *I = action.inputs.front(); I; I = I->next()) { + // Add event and event text to respective arrays. + events.push_back(I->get()); + event_strings.push_back(I->get()->as_text()); + + // Only check if the events have been the same so far - once one fails, we don't need to check any more. + if (same_as_defaults) { + Ref<InputEventKey> k = defaults[count]; + // Only check keys, since we are in the editor. + if (k.is_valid() && !defaults[count]->shortcut_match(I->get())) { + same_as_defaults = false; + } + } + count++; + } + + // Join the text of the events with a delimiter so they can all be displayed in one cell. + String events_display_string = event_strings.is_empty() ? "None" : String("; ").join(event_strings); + + TreeItem *item = shortcuts->create_item(common_section); + item->set_text(0, action_name); + item->set_text(1, events_display_string); + + if (!same_as_defaults) { + item->add_button(1, shortcuts->get_theme_icon("Reload", "EditorIcons"), 2); + } + + if (events_display_string == "None") { + // Fade out unassigned shortcut labels for easier visual grepping. + item->set_custom_color(1, shortcuts->get_theme_color("font_color", "Label") * Color(1, 1, 1, 0.5)); + } + + item->add_button(1, shortcuts->get_theme_icon("Edit", "EditorIcons"), 0); + item->add_button(1, shortcuts->get_theme_icon("Close", "EditorIcons"), 1); + item->set_tooltip(0, action_name); + item->set_tooltip(1, events_display_string); + item->set_metadata(0, "Common"); + item->set_metadata(1, events); + } + + // Editor Shortcuts + + List<String> slist; + EditorSettings::get_singleton()->get_shortcut_list(&slist); + for (List<String>::Element *E = slist.front(); E; E = E->next()) { Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(E->get()); if (!sc->has_meta("original")) { @@ -267,84 +391,119 @@ void EditorSettingsDialog::_shortcut_button_pressed(Object *p_item, int p_column TreeItem *ti = Object::cast_to<TreeItem>(p_item); ERR_FAIL_COND(!ti); - String item = ti->get_metadata(0); - Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(item); - - if (p_idx == 0) { - press_a_key_label->set_text(TTR("Press a Key...")); - last_wait_for_key = Ref<InputEventKey>(); - press_a_key->popup_centered(Size2(250, 80) * EDSCALE); - //press_a_key->grab_focus(); - press_a_key->get_ok_button()->set_focus_mode(Control::FOCUS_NONE); - press_a_key->get_cancel_button()->set_focus_mode(Control::FOCUS_NONE); - shortcut_configured = item; - - } else if (p_idx == 1) { //erase - if (!sc.is_valid()) { - return; //pointless, there is nothing + if (ti->get_metadata(0) == "Common") { + // Editing a Built-in action, which can have multiple bindings. + button_idx = p_idx; + editing_action = true; + current_action = ti->get_text(0); + + switch (button_idx) { + case SHORTCUT_REVERT: { + Array events; + List<Ref<InputEvent>> defaults = InputMap::get_singleton()->get_builtins()[current_action]; + + // Convert the list to an array, and only keep key events as this is for the editor. + for (List<Ref<InputEvent>>::Element *E = defaults.front(); E; E = E->next()) { + Ref<InputEventKey> k = E->get(); + if (k.is_valid()) { + events.append(E->get()); + } + } + + _update_builtin_action(current_action, events); + } break; + case SHORTCUT_EDIT: + case SHORTCUT_ERASE: { + // For Edit end Delete, we will show a popup which displays each event so the user can select which one to edit/delete. + current_action_events = ti->get_metadata(1); + action_popup->clear(); + + for (int i = 0; i < current_action_events.size(); i++) { + Ref<InputEvent> ie = current_action_events[i]; + action_popup->add_item(ie->as_text()); + action_popup->set_item_metadata(i, ie); + } + + if (button_idx == SHORTCUT_EDIT) { + // If editing, add a button which can be used to add an additional event. + action_popup->add_icon_item(get_theme_icon("Add", "EditorIcons"), TTR("Add")); + } + + action_popup->set_position(get_position() + get_mouse_position()); + action_popup->take_mouse_focus(); + action_popup->popup(); + action_popup->set_as_minsize(); + } break; + default: + break; } - - undo_redo->create_action(TTR("Erase Shortcut")); - undo_redo->add_do_method(sc.ptr(), "set_shortcut", Ref<InputEvent>()); - undo_redo->add_undo_method(sc.ptr(), "set_shortcut", sc->get_shortcut()); - undo_redo->add_do_method(this, "_update_shortcuts"); - undo_redo->add_undo_method(this, "_update_shortcuts"); - undo_redo->add_do_method(this, "_settings_changed"); - undo_redo->add_undo_method(this, "_settings_changed"); - undo_redo->commit_action(); - } else if (p_idx == 2) { //revert to original - if (!sc.is_valid()) { - return; //pointless, there is nothing + } else { + // Editing an Editor Shortcut, which can only have 1 binding. + String item = ti->get_metadata(0); + Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(item); + editing_action = false; + + switch (button_idx) { + case EditorSettingsDialog::SHORTCUT_EDIT: + shortcut_editor->popup_and_configure(sc->get_shortcut()); + shortcut_being_edited = item; + break; + case EditorSettingsDialog::SHORTCUT_ERASE: { + if (!sc.is_valid()) { + return; //pointless, there is nothing + } + + undo_redo->create_action(TTR("Erase Shortcut")); + undo_redo->add_do_method(sc.ptr(), "set_shortcut", Ref<InputEvent>()); + undo_redo->add_undo_method(sc.ptr(), "set_shortcut", sc->get_shortcut()); + undo_redo->add_do_method(this, "_update_shortcuts"); + undo_redo->add_undo_method(this, "_update_shortcuts"); + undo_redo->add_do_method(this, "_settings_changed"); + undo_redo->add_undo_method(this, "_settings_changed"); + undo_redo->commit_action(); + } break; + case EditorSettingsDialog::SHORTCUT_REVERT: { + if (!sc.is_valid()) { + return; //pointless, there is nothing + } + + Ref<InputEvent> original = sc->get_meta("original"); + + undo_redo->create_action(TTR("Restore Shortcut")); + undo_redo->add_do_method(sc.ptr(), "set_shortcut", original); + undo_redo->add_undo_method(sc.ptr(), "set_shortcut", sc->get_shortcut()); + undo_redo->add_do_method(this, "_update_shortcuts"); + undo_redo->add_undo_method(this, "_update_shortcuts"); + undo_redo->add_do_method(this, "_settings_changed"); + undo_redo->add_undo_method(this, "_settings_changed"); + undo_redo->commit_action(); + } break; + default: + break; } - - Ref<InputEvent> original = sc->get_meta("original"); - - undo_redo->create_action(TTR("Restore Shortcut")); - undo_redo->add_do_method(sc.ptr(), "set_shortcut", original); - undo_redo->add_undo_method(sc.ptr(), "set_shortcut", sc->get_shortcut()); - undo_redo->add_do_method(this, "_update_shortcuts"); - undo_redo->add_undo_method(this, "_update_shortcuts"); - undo_redo->add_do_method(this, "_settings_changed"); - undo_redo->add_undo_method(this, "_settings_changed"); - undo_redo->commit_action(); } } -void EditorSettingsDialog::_wait_for_key(const Ref<InputEvent> &p_event) { - Ref<InputEventKey> k = p_event; - - if (k.is_valid() && k->is_pressed() && k->get_keycode() != 0) { - last_wait_for_key = k; - const String str = keycode_get_string(k->get_keycode_with_modifiers()); - - press_a_key_label->set_text(str); - press_a_key->set_input_as_handled(); - } -} - -void EditorSettingsDialog::_press_a_key_confirm() { - if (last_wait_for_key.is_null()) { - return; +void EditorSettingsDialog::_builtin_action_popup_index_pressed(int p_index) { + switch (button_idx) { + case SHORTCUT_EDIT: { + if (p_index == action_popup->get_item_count() - 1) { + // Selected last item in list (Add button), therefore add new + current_action_event_index = -1; + shortcut_editor->popup_and_configure(); + } else { + // Configure existing + current_action_event_index = p_index; + shortcut_editor->popup_and_configure(action_popup->get_item_metadata(p_index)); + } + } break; + case SHORTCUT_ERASE: { + current_action_events.remove(p_index); + _update_builtin_action(current_action, current_action_events); + } break; + default: + break; } - - Ref<InputEventKey> ie; - ie.instance(); - ie->set_keycode(last_wait_for_key->get_keycode()); - ie->set_shift(last_wait_for_key->get_shift()); - ie->set_control(last_wait_for_key->get_control()); - ie->set_alt(last_wait_for_key->get_alt()); - ie->set_metakey(last_wait_for_key->get_metakey()); - - Ref<Shortcut> sc = EditorSettings::get_singleton()->get_shortcut(shortcut_configured); - - undo_redo->create_action(TTR("Change Shortcut") + " '" + shortcut_configured + "'"); - undo_redo->add_do_method(sc.ptr(), "set_shortcut", ie); - undo_redo->add_undo_method(sc.ptr(), "set_shortcut", sc->get_shortcut()); - undo_redo->add_do_method(this, "_update_shortcuts"); - undo_redo->add_undo_method(this, "_update_shortcuts"); - undo_redo->add_do_method(this, "_settings_changed"); - undo_redo->add_undo_method(this, "_settings_changed"); - undo_redo->commit_action(); } void EditorSettingsDialog::_tabs_tab_changed(int p_tab) { @@ -382,9 +541,14 @@ void EditorSettingsDialog::_editor_restart_close() { void EditorSettingsDialog::_bind_methods() { ClassDB::bind_method(D_METHOD("_unhandled_input"), &EditorSettingsDialog::_unhandled_input); ClassDB::bind_method(D_METHOD("_update_shortcuts"), &EditorSettingsDialog::_update_shortcuts); + ClassDB::bind_method(D_METHOD("_settings_changed"), &EditorSettingsDialog::_settings_changed); } EditorSettingsDialog::EditorSettingsDialog() { + action_popup = memnew(PopupMenu); + action_popup->connect("index_pressed", callable_mp(this, &EditorSettingsDialog::_builtin_action_popup_index_pressed)); + add_child(action_popup); + set_title(TTR("Editor Settings")); undo_redo = memnew(UndoRedo); @@ -442,21 +606,17 @@ EditorSettingsDialog::EditorSettingsDialog() { // Shortcuts Tab tab_shortcuts = memnew(VBoxContainer); + tabs->add_child(tab_shortcuts); tab_shortcuts->set_name(TTR("Shortcuts")); - hbc = memnew(HBoxContainer); - hbc->set_h_size_flags(Control::SIZE_EXPAND_FILL); - 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); + tab_shortcuts->add_child(shortcut_search_box); shortcut_search_box->connect("text_changed", callable_mp(this, &EditorSettingsDialog::_filter_shortcuts)); shortcuts = memnew(Tree); - tab_shortcuts->add_child(shortcuts, true); shortcuts->set_v_size_flags(Control::SIZE_EXPAND_FILL); shortcuts->set_columns(2); shortcuts->set_hide_root(true); @@ -464,21 +624,13 @@ EditorSettingsDialog::EditorSettingsDialog() { shortcuts->set_column_title(0, TTR("Name")); shortcuts->set_column_title(1, TTR("Binding")); shortcuts->connect("button_pressed", callable_mp(this, &EditorSettingsDialog::_shortcut_button_pressed)); + tab_shortcuts->add_child(shortcuts); - press_a_key = memnew(ConfirmationDialog); - //press_a_key->set_focus_mode(Control::FOCUS_ALL); - add_child(press_a_key); - - Label *l = memnew(Label); - l->set_text(TTR("Press a Key...")); - l->set_anchors_and_offsets_preset(Control::PRESET_WIDE); - l->set_align(Label::ALIGN_CENTER); - l->set_offset(SIDE_TOP, 20); - l->set_anchor_and_offset(SIDE_BOTTOM, Control::ANCHOR_BEGIN, 30); - press_a_key_label = l; - press_a_key->add_child(l); - press_a_key->connect("window_input", callable_mp(this, &EditorSettingsDialog::_wait_for_key)); - press_a_key->connect("confirmed", callable_mp(this, &EditorSettingsDialog::_press_a_key_confirm)); + // Adding event dialog + shortcut_editor = memnew(InputEventConfigurationDialog); + shortcut_editor->connect("confirmed", callable_mp(this, &EditorSettingsDialog::_event_config_confirmed)); + shortcut_editor->set_allowed_input_types(InputEventConfigurationDialog::InputType::INPUT_KEY); + add_child(shortcut_editor); set_hide_on_ok(true); diff --git a/editor/settings_config_dialog.h b/editor/settings_config_dialog.h index b1ee58ae8f..c38fceedf1 100644 --- a/editor/settings_config_dialog.h +++ b/editor/settings_config_dialog.h @@ -31,6 +31,7 @@ #ifndef SETTINGS_CONFIG_DIALOG_H #define SETTINGS_CONFIG_DIALOG_H +#include "editor/action_map_editor.h" #include "editor/editor_sectioned_inspector.h" #include "editor_inspector.h" #include "scene/gui/dialogs.h" @@ -52,16 +53,28 @@ class EditorSettingsDialog : public AcceptDialog { LineEdit *shortcut_search_box; SectionedInspector *inspector; + enum ShortcutButton { + SHORTCUT_EDIT, + SHORTCUT_ERASE, + SHORTCUT_REVERT + }; + + int button_idx; + int current_action_event_index = -1; + bool editing_action = false; + String current_action; + Array current_action_events; + PopupMenu *action_popup; + Timer *timer; UndoRedo *undo_redo; - Tree *shortcuts; - ConfirmationDialog *press_a_key; - Label *press_a_key_label; - Ref<InputEventKey> last_wait_for_key; - String shortcut_configured; + // Shortcuts String shortcut_filter; + Tree *shortcuts; + InputEventConfigurationDialog *shortcut_editor; + String shortcut_being_edited; virtual void cancel_pressed() override; virtual void ok_pressed() override; @@ -74,20 +87,20 @@ class EditorSettingsDialog : public AcceptDialog { void _notification(int p_what); void _update_icons(); - void _press_a_key_confirm(); - void _wait_for_key(const Ref<InputEvent> &p_event); + void _event_config_confirmed(); + + void _update_builtin_action(const String &p_name, const Array &p_events); void _tabs_tab_changed(int p_tab); void _focus_current_search_box(); - void _clear_shortcut_search_box(); - void _clear_search_box(); - void _filter_shortcuts(const String &p_filter); void _update_shortcuts(); void _shortcut_button_pressed(Object *p_item, int p_column, int p_idx); + void _builtin_action_popup_index_pressed(int p_index); + static void _undo_redo_callback(void *p_self, const String &p_name); Label *restart_label; diff --git a/editor/shader_globals_editor.cpp b/editor/shader_globals_editor.cpp index 14d305e34f..ebef5be9ed 100644 --- a/editor/shader_globals_editor.cpp +++ b/editor/shader_globals_editor.cpp @@ -427,7 +427,7 @@ void ShaderGlobalsEditor::_variable_deleted(const String &p_variable) { void ShaderGlobalsEditor::_changed() { emit_signal("globals_changed"); if (!interface->block_update) { - interface->_change_notify(); + interface->notify_property_list_changed(); } } @@ -483,8 +483,5 @@ ShaderGlobalsEditor::ShaderGlobalsEditor() { } ShaderGlobalsEditor::~ShaderGlobalsEditor() { - if (is_visible_in_tree()) { - inspector->edit(nullptr); - } memdelete(interface); } diff --git a/editor/translations/af.po b/editor/translations/af.po index 5caef149fa..bda0eed750 100644 --- a/editor/translations/af.po +++ b/editor/translations/af.po @@ -659,7 +659,7 @@ msgstr "Stel Oorgange na:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1913,8 +1913,8 @@ msgid "Open a File or Directory" msgstr "Open 'n Lêer of Gids" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Stoor" @@ -2581,7 +2581,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2981,14 +2981,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Soek" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3143,6 +3135,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3349,7 +3357,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4071,6 +4079,21 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Skep Vouer" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Ek sien..." + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Laai Verstek" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -5069,7 +5092,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5178,7 +5201,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -7006,6 +7028,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Soek" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7058,16 +7088,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -7167,8 +7187,8 @@ msgstr "Skep" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7402,6 +7422,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -10017,6 +10041,11 @@ msgid "Projects" msgstr "Projek Stigters" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "Laai" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10382,6 +10411,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Laai Verstek" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10632,6 +10666,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Anim Dupliseer Sleutels" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Deursoek Hulp" @@ -10758,6 +10801,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Anim Dupliseer Sleutels" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -12396,6 +12444,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12651,11 +12707,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/ar.po b/editor/translations/ar.po index 2cfe1ac76c..5c03984e01 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -46,12 +46,13 @@ # Musab Alasaifer <mousablasefer@gmail.com>, 2020. # Yassine Oudjana <y.oudjana@protonmail.com>, 2020. # bruvzg <bruvzg13@gmail.com>, 2020. -# StarlkYT <mrsstarlkps4@gmail.com>, 2020. +# StarlkYT <mrsstarlkps4@gmail.com>, 2020, 2021. +# Games Toon <xxtvgoodxx@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-12-29 15:03+0000\n" +"PO-Revision-Date: 2021-03-07 06:04+0000\n" "Last-Translator: StarlkYT <mrsstarlkps4@gmail.com>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot/ar/>\n" @@ -61,7 +62,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 4.4.1-dev\n" +"X-Generator: Weblate 4.5.1\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -684,7 +685,7 @@ msgstr "إختر المقاطع المراد نسخها" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "نسخ" @@ -1701,9 +1702,8 @@ msgid "Node Dock" msgstr "رصيف العُقد" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem Dock" -msgstr "نظام الملفات" +msgstr "قوائم نظام الملفات" #: editor/editor_feature_profile.cpp msgid "Import Dock" @@ -1885,8 +1885,8 @@ msgid "Open a File or Directory" msgstr "إفتح ملف أو وجهة" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "حفظ" @@ -2342,6 +2342,9 @@ msgid "" "To restore the Default layout to its base settings, use the Delete Layout " "option and delete the Default layout." msgstr "" +"تم تجاوز اعدادات المحرر الاساسيه.\n" +"لإستعادة اعدادات المحرر, اذهب إلى خيار 'Delete Layout' من ثم إحفظ الاعدادات " +"الاساسيه." #: editor/editor_node.cpp msgid "Layout name not found!" @@ -2406,7 +2409,7 @@ msgstr "ليس هناك مشهد محدد ليتم تشغيله." #: editor/editor_node.cpp msgid "Save scene before running..." -msgstr "" +msgstr "احفظ المشهد قبل التشغيل..." #: editor/editor_node.cpp msgid "Could not start subprocess!" @@ -2551,7 +2554,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "غير قادر علي تفعيل إضافة البرنامج المُساعد في: '%s' تحميل الظبط فشل." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "غير قادر علي إيجاد منطقة النص البرمجي من أجل إضافة البرنامج في: 'res://" "addons/%s'." @@ -2983,14 +2987,6 @@ msgid "Help" msgstr "مساعدة" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "بحث" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "مستندات الإنترنت" @@ -3154,6 +3150,24 @@ msgid "Open & Run a Script" msgstr "فتح و تشغيل كود" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"الملفات التالية أحدث على القرص.\n" +"ما الإجراء الذي ينبغي اتخاذه؟" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "إعادة تحميل" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "إعادة حفظ" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "موروث جديد" @@ -3363,7 +3377,7 @@ msgstr "إجعلة مميزاً" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "لصق" @@ -4062,6 +4076,21 @@ msgstr "هل قمت بإرجاع كائن مشتق من العقدة في دال msgid "Saving..." msgstr "جاري الحفظ..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "تحديد الوضع" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "إستيراد" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "تحميل الإفتراضي" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d ملفات" @@ -5028,7 +5057,8 @@ msgid "Got:" msgstr "ما تم الحصول عليه:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "فشل التاكد من ترميز sha256" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5132,7 +5162,6 @@ msgid "Sort:" msgstr "ترتيب:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "الفئة:" @@ -6955,6 +6984,14 @@ msgstr "إغلاق المستندات" msgid "Run" msgstr "تشغيل" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "بحث" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "اخط خطوة ضمن" @@ -7008,16 +7045,6 @@ msgstr "" "الملفات التالية أحدث على القرص.\n" "ما الإجراء الذي ينبغي اتخاذه؟:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "إعادة تحميل" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "إعادة حفظ" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "مُنقح الأخطاء" @@ -7111,8 +7138,8 @@ msgstr "نقاط التكسّر" msgid "Go To" msgstr "التوجه إلى" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "قص" @@ -7335,6 +7362,10 @@ msgid "Yaw" msgstr "الإنحراف Yaw" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "الحجم" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "كائنات مرسومة" @@ -10023,6 +10054,11 @@ msgid "Projects" msgstr "المشاريع" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "يستقبل المرايا، من فضلك إنتظر..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "آخر ما تم تعديله" @@ -10392,6 +10428,11 @@ msgstr "تحميل تلقائي" msgid "Plugins" msgstr "إضافات" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "تحميل الإفتراضي" + #: editor/property_editor.cpp msgid "Preset..." msgstr "إعداد مُسبق..." @@ -10453,9 +10494,8 @@ msgid "Batch Rename" msgstr "إعادة تسمية الدفعة" #: editor/rename_dialog.cpp -#, fuzzy msgid "Replace:" -msgstr "إستبدال: " +msgstr "إستبدال:" #: editor/rename_dialog.cpp #, fuzzy @@ -10644,6 +10684,16 @@ msgid "Instance Child Scene" msgstr "نمذجة المشهد الابن" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "لا يمكن تنفيذ الإجراء على عُقدة من مشهد أجنبي!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "لصق العُقد" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "فصل النص البرمجي" @@ -10771,6 +10821,11 @@ msgid "Attach Script" msgstr "إلحاق نص برمجي" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "قص العُقد" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "إزالة عُقدة (عُقد)" @@ -12427,6 +12482,14 @@ msgstr "" "مُضلع تصادم ثنائي الأبعاد (CollisionPolygon2D) الفارغ ليس له أي تأثير على " "التصادم." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12763,11 +12826,6 @@ msgstr "" "GIProbes لا يدعم برنامج تشغيل الفيديو GLES2.\n" "استخدم BakedLightmap بدلاً من ذلك." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "بقعة الضوء بزاوية أكبر من 90 درجة لا يمكنها إلقاء الظلال." diff --git a/editor/translations/bg.po b/editor/translations/bg.po index fd7a8f4332..848574a1f1 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-01-22 10:21+0000\n" +"PO-Revision-Date: 2021-03-10 22:14+0000\n" "Last-Translator: Любомир Василев <lyubomirv@gmx.com>\n" "Language-Team: Bulgarian <https://hosted.weblate.org/projects/godot-engine/" "godot/bg/>\n" @@ -26,7 +26,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 4.5-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -640,7 +640,7 @@ msgstr "Изберете пътечки за копиране" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Копиране" @@ -1811,8 +1811,8 @@ msgid "Open a File or Directory" msgstr "Отваряне на файл или папка" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Запазване" @@ -2232,11 +2232,11 @@ msgstr "" #: editor/editor_node.cpp msgid "Can't load MeshLibrary for merging!" -msgstr "" +msgstr "Не може да се зареди библиотеката с полигонни мрежи за сливане!" #: editor/editor_node.cpp msgid "Error saving MeshLibrary!" -msgstr "" +msgstr "Грешка при запазването на библиотеката с полигонни мрежи!" #: editor/editor_node.cpp msgid "Can't load TileSet for merging!" @@ -2359,7 +2359,7 @@ msgstr "Операцията не може да се извърши без сц #: editor/editor_node.cpp msgid "Export Mesh Library" -msgstr "" +msgstr "Изнасяне на библиотека с полигонни мрежи" #: editor/editor_node.cpp msgid "This operation can't be done without a root node." @@ -2446,39 +2446,50 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "" +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "Не може да бъде намерено полето за скрипт за добавката: „%s“." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." -msgstr "Не може да се зареди скриптът на добавка от: „%s“." +msgstr "Не може да се зареди добавката-скрипт от: „%s“." #: editor/editor_node.cpp msgid "" "Unable to load addon script from path: '%s' There seems to be an error in " "the code, please check the syntax." msgstr "" +"Не може да се зареди добавката-скрипт от: „%s“. Изглежда има грешка в кода. " +"Моля, проверете синтаксиса." #: editor/editor_node.cpp msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." msgstr "" +"Не може да се зареди добавката-скрипт от: „%s“. Базовият тип не е " +"„EditorPlugin“." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." msgstr "" +"Не може да се зареди добавката-скрипт от: „%s“. Скриптът не е в режим на " +"„инструмент“." #: editor/editor_node.cpp msgid "" "Scene '%s' was automatically imported, so it can't be modified.\n" "To make changes to it, a new inherited scene can be created." msgstr "" +"Сцената „%s“ е била внесена автоматично и затова не може да се променя.\n" +"Ако искате да правите промени в нея, може да създадете нова сцена-наследник." #: editor/editor_node.cpp msgid "" "Error loading scene, it must be inside the project path. Use 'Import' to " "open the scene, then save it inside the project path." msgstr "" +"Грешка при зареждането на сцената. Тя трябва да се намира в папката на " +"проекта. Използвайте „Внасяне“, за да отворите сцената, и след това я " +"запазете някъде в папката на проекта." #: editor/editor_node.cpp msgid "Scene '%s' has broken dependencies:" @@ -2494,6 +2505,9 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"Няма определена главна сцена. Искате ли да изберете такава сега?\n" +"Можете да промените това по всяко време в „Настройките на проекта“, в " +"категорията „Приложение“." #: editor/editor_node.cpp msgid "" @@ -2501,6 +2515,9 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"Избраната сцена „%s“ не съществува. Искате ли да изберете друга?\n" +"Можете да промените това по всяко време в „Настройките на проекта“, в " +"категорията „Приложение“." #: editor/editor_node.cpp msgid "" @@ -2508,6 +2525,10 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"Избраната сцена „%s“ не е файл съдържащ сцена. Искате ли да изберете " +"подходящ файл?\n" +"Можете да промените това по всяко време в „Настройките на проекта“, в " +"категорията „Приложение“." #: editor/editor_node.cpp msgid "Save Layout" @@ -2641,7 +2662,7 @@ msgstr "" #: editor/editor_node.cpp msgid "MeshLibrary..." -msgstr "" +msgstr "Библиотека с полигонни мрежи…" #: editor/editor_node.cpp msgid "TileSet..." @@ -2758,6 +2779,8 @@ msgid "" "When this option is enabled, navigation meshes and polygons will be visible " "in the running project." msgstr "" +"Ако тази настройка е включено, навигационните полигони и мрежи ще бъдат " +"видими в изпълняващия се проект." #: editor/editor_node.cpp msgid "Synchronize Scene Changes" @@ -2836,14 +2859,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Търсене" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -2997,6 +3012,24 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"Следните файлове са по-нови на диска.\n" +"Кое действие трябва да се предприеме?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Презареждане" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Презаписване" + +#: editor/editor_node.cpp #, fuzzy msgid "New Inherited" msgstr "Нов скрипт" @@ -3200,7 +3233,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Поставяне" @@ -3855,7 +3888,7 @@ msgstr "" #: editor/import/resource_importer_scene.cpp msgid "Generating for Mesh: " -msgstr "" +msgstr "Създаване за полигонна мрежа: " #: editor/import/resource_importer_scene.cpp msgid "Running Custom Script..." @@ -3881,9 +3914,21 @@ msgstr "" msgid "Saving..." msgstr "Запазване..." +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "Изберете метод на внасяне" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "Метод на внасяне:" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "Връщане на стандартните настройки" + #: editor/import_dock.cpp msgid "%d Files" -msgstr "%d Файлове" +msgstr "%d файла" #: editor/import_dock.cpp msgid "Set as Default for '%s'" @@ -4339,7 +4384,7 @@ msgstr "Ново име на анимацията:" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New Anim" -msgstr "" +msgstr "Нова анимация" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" @@ -4353,20 +4398,20 @@ msgstr "Изтриване на анимацията?" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Remove Animation" -msgstr "" +msgstr "Премахване на анимацията" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Invalid animation name!" -msgstr "" +msgstr "Неправилно име на анимацията!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation name already exists!" -msgstr "" +msgstr "Вече съществува анимация с това име!" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Rename Animation" -msgstr "" +msgstr "Преименуване на анимацията" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" @@ -4374,19 +4419,19 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Blend Time" -msgstr "" +msgstr "Промяна на времето на смесване" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load Animation" -msgstr "" +msgstr "Зареждане на анимация" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" -msgstr "" +msgstr "Дублиране на анимацията" #: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to copy!" -msgstr "" +msgstr "Няма анимация за копиране!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation resource on clipboard!" @@ -4394,11 +4439,11 @@ msgstr "Няма ресурс–анимация в буфера за обмен #: editor/plugins/animation_player_editor_plugin.cpp msgid "Pasted Animation" -msgstr "" +msgstr "Поставена анимация" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Paste Animation" -msgstr "" +msgstr "Поставяне на анимация" #: editor/plugins/animation_player_editor_plugin.cpp msgid "No animation to edit!" @@ -4407,30 +4452,32 @@ msgstr "Няма анимация за редактиране!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from current pos. (A)" msgstr "" +"Възпроизвеждане на избраната анимация наобратно от текущата позиция. (A)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from end. (Shift+A)" -msgstr "" +msgstr "Възпроизвеждане на избраната анимация наобратно от края. (Shift+A)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Stop animation playback. (S)" -msgstr "" +msgstr "Спиране на възпроизвеждането на анимацията. (S)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from start. (Shift+D)" -msgstr "" +msgstr "Възпроизвеждане на избраната анимация от началото. (Shift+D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from current pos. (D)" -msgstr "" +msgstr "Възпроизвеждане на избраната анимация от текущата позиция. (D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation position (in seconds)." -msgstr "" +msgstr "Позиция в анимацията (в секунди)." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Scale animation playback globally for the node." msgstr "" +"Скалиране на скоростта на възпроизвеждане на анимацията глобално за възела." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Tools" @@ -4438,7 +4485,7 @@ msgstr "Инструменти за анимациите" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation" -msgstr "" +msgstr "Анимация" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Edit Transitions..." @@ -4446,7 +4493,7 @@ msgstr "Редактиране на преходите..." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Open in Inspector" -msgstr "" +msgstr "Отваряне в инспектора" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Display list of animations in player." @@ -4454,15 +4501,15 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Autoplay on Load" -msgstr "" +msgstr "Авт. възпроизвеждане при зареждане" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Enable Onion Skinning" -msgstr "" +msgstr "Показване на избледняващи кадри" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Onion Skinning Options" -msgstr "" +msgstr "Настройки на режима с избледняващи кадри" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Directions" @@ -4510,11 +4557,11 @@ msgstr "Закачане на AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" -msgstr "" +msgstr "Създаване на нова анимация" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" -msgstr "" +msgstr "Име на анимацията:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/resource_preloader_editor_plugin.cpp @@ -4525,15 +4572,15 @@ msgstr "Грешка!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Times:" -msgstr "" +msgstr "Времена на смесване:" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Next (Auto Queue):" -msgstr "" +msgstr "Следваща (авт. опашка):" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Cross-Animation Blend Times" -msgstr "" +msgstr "Времена на смесване между анимациите" #: editor/plugins/animation_state_machine_editor.cpp msgid "Move Node" @@ -4550,23 +4597,23 @@ msgstr "Добавяне на преход" #: editor/plugins/animation_state_machine_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Add Node" -msgstr "" +msgstr "Добавяне на възел" #: editor/plugins/animation_state_machine_editor.cpp msgid "End" -msgstr "" +msgstr "Край" #: editor/plugins/animation_state_machine_editor.cpp msgid "Immediate" -msgstr "" +msgstr "Незабавно" #: editor/plugins/animation_state_machine_editor.cpp msgid "Sync" -msgstr "" +msgstr "Синхронизиране" #: editor/plugins/animation_state_machine_editor.cpp msgid "At End" -msgstr "" +msgstr "На края" #: editor/plugins/animation_state_machine_editor.cpp msgid "Travel" @@ -4837,7 +4884,8 @@ msgid "Got:" msgstr "Получено:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Неуспешна проверка на хеш от вид „sha256“" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4941,7 +4989,6 @@ msgid "Sort:" msgstr "Сортиране:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Категория:" @@ -5461,7 +5508,7 @@ msgstr "Преглед" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Always Show Grid" -msgstr "" +msgstr "Винаги да се показва решетката" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Helpers" @@ -5469,7 +5516,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Rulers" -msgstr "" +msgstr "Показване на линиите" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Guides" @@ -5668,12 +5715,12 @@ msgstr "" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emission Points From Mesh" -msgstr "" +msgstr "Създаване на излъчващи точки от полигонната мрежа" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emission Points From Node" -msgstr "" +msgstr "Създаване на излъчващи точки от възела" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 0" @@ -5770,7 +5817,7 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh is empty!" -msgstr "" +msgstr "Полигонната мрежа е празна!" #: editor/plugins/mesh_instance_editor_plugin.cpp #, fuzzy @@ -5815,19 +5862,21 @@ msgstr "Създаване на няколко изпъкнали форми" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Navigation Mesh" -msgstr "" +msgstr "Създаване на навигационна полигонна мрежа" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Contained Mesh is not of type ArrayMesh." -msgstr "" +msgstr "Съдържащата се полигонна мрежа не е от тип ArrayMesh." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "UV Unwrap failed, mesh may not be manifold?" msgstr "" +"Разгъването на UV беше неуспешно. Възможно ли е полигонната мрежа да се " +"състои от повече от една форма?" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "No mesh to debug." -msgstr "" +msgstr "Няма полигонна мрежа за дебъгване." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Model has no UV in this layer" @@ -5835,15 +5884,15 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "MeshInstance lacks a Mesh!" -msgstr "" +msgstr "В MeshInstance няма полигонна мрежа!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh has not surface to create outlines from!" -msgstr "" +msgstr "Полигонната мрежа няма повърхност, от която да се създадат контури!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!" -msgstr "" +msgstr "Примитивният тип на полигонната мрежа не е PRIMITIVE_TRIANGLES!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Could not create outline!" @@ -5855,7 +5904,7 @@ msgstr "Създаване на контур" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh" -msgstr "" +msgstr "Полигонна мрежа" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Static Body" @@ -5902,7 +5951,7 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh..." -msgstr "" +msgstr "Създаване на контурна полигонна мрежа…" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "" @@ -5911,6 +5960,10 @@ msgid "" "This can be used instead of the SpatialMaterial Grow property when using " "that property isn't possible." msgstr "" +"Създава статична полигонна мрежа за контура. Нормалите на контурната " +"полигонна мрежа ще бъдат автоматично обърнати.\n" +"Това може да се използва вместо свойството Grow на SpatialMaterial, когато " +"това свойство не може да се променя." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "View UV1" @@ -5926,7 +5979,7 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh" -msgstr "" +msgstr "Създаване на контурна полигонна мрежа" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Outline Size:" @@ -5950,7 +6003,7 @@ msgstr "" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Mesh Library" -msgstr "Библиотека от полигонни мрежи" +msgstr "Библиотека с полигонни мрежи" #: editor/plugins/mesh_library_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp @@ -5972,22 +6025,27 @@ msgstr "Обновяване от сцена" #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and no MultiMesh set in node)." msgstr "" +"Няма посочен източник за полигонна мрежа (и във възела няма MultiMesh)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and MultiMesh contains no Mesh)." msgstr "" +"Няма посочен източник за полигонна мрежа (и MultiMesh не съдържа полигонна " +"мрежа)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (invalid path)." -msgstr "" +msgstr "Източникът за полигонна мрежа е неправилен (грешен път)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (not a MeshInstance)." -msgstr "" +msgstr "Източникът за полигонна мрежа е неправилен (не е MeshInstance)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (contains no Mesh resource)." msgstr "" +"Източникът за полигонна мрежа е неправилен (не съдържа ресурс, който е " +"полигонна мрежа)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "No surface source specified." @@ -6007,7 +6065,7 @@ msgstr "" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Select a Source Mesh:" -msgstr "" +msgstr "Изберете източник за полигонна мрежа:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Select a Target Surface:" @@ -6027,7 +6085,7 @@ msgstr "" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Source Mesh:" -msgstr "" +msgstr "Източник за полигонна мрежа:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "X-Axis" @@ -6043,7 +6101,7 @@ msgstr "" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh Up Axis:" -msgstr "" +msgstr "Ос сочеща нагоре за полигонната мрежа:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Random Rotation:" @@ -6118,15 +6176,15 @@ msgstr "" #: editor/plugins/particles_editor_plugin.cpp msgid "Emission Points:" -msgstr "" +msgstr "Излъчващи точки:" #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points" -msgstr "" +msgstr "Точки на повърхността" #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points+Normal (Directed)" -msgstr "" +msgstr "Точки на повърхността + нормали (насочени)" #: editor/plugins/particles_editor_plugin.cpp msgid "Volume" @@ -6134,7 +6192,7 @@ msgstr "Обем" #: editor/plugins/particles_editor_plugin.cpp msgid "Emission Source: " -msgstr "" +msgstr "Източник на излъчването: " #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." @@ -6729,6 +6787,14 @@ msgstr "Затваряне на документацията" msgid "Run" msgstr "Пускане" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Търсене" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6782,16 +6848,6 @@ msgstr "" "Следните файлове са по-нови на диска.\n" "Кое действие трябва да се предприеме?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Презареждане" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Презаписване" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Дебъгер" @@ -6884,8 +6940,8 @@ msgstr "Точки на прекъсване" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Изрязване" @@ -7108,6 +7164,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -7533,15 +7593,15 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't replace by mesh." -msgstr "" +msgstr "Неправилна геометрия. Не може да се замени с полигонна мрежа." #: editor/plugins/sprite_editor_plugin.cpp msgid "Convert to Mesh2D" -msgstr "" +msgstr "Преобразуване в Mesh2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create polygon." -msgstr "" +msgstr "Неправилна геометрия, не може да се създаде полигон." #: editor/plugins/sprite_editor_plugin.cpp msgid "Convert to Polygon2D" @@ -7549,7 +7609,7 @@ msgstr "Превръщане в Polygon2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create collision polygon." -msgstr "" +msgstr "Неправилна геометрия, не може да се създаде полигон за колизии." #: editor/plugins/sprite_editor_plugin.cpp msgid "Create CollisionPolygon2D Sibling" @@ -7561,7 +7621,7 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create LightOccluder2D Sibling" -msgstr "" +msgstr "Създаване на съседен LightOccluder2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" @@ -7569,15 +7629,15 @@ msgstr "" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " -msgstr "" +msgstr "Опростяване: " #: editor/plugins/sprite_editor_plugin.cpp msgid "Shrink (Pixels): " -msgstr "" +msgstr "Смаляване (пиксели): " #: editor/plugins/sprite_editor_plugin.cpp msgid "Grow (Pixels): " -msgstr "" +msgstr "Уголемяване (пиксели): " #: editor/plugins/sprite_editor_plugin.cpp msgid "Update Preview" @@ -7593,11 +7653,11 @@ msgstr "Няма избрани кадри" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add %d Frame(s)" -msgstr "" +msgstr "Добавяне на %d кадър/кадри" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frame" -msgstr "" +msgstr "Добавяне на кадър" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Unable to load images" @@ -7605,27 +7665,27 @@ msgstr "Изображенията не могат да бъдат зареде #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "ERROR: Couldn't load frame resource!" -msgstr "" +msgstr "ГРЕШКА: Не може да се зареди ресурсът с кадъра!" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Resource clipboard is empty or not a texture!" -msgstr "" +msgstr "Буферът за обмен на ресурси е празен или не съдържа текстура!" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Paste Frame" -msgstr "" +msgstr "Поставяне на кадър" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Empty" -msgstr "" +msgstr "Добавяне на празен" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation FPS" -msgstr "" +msgstr "Промяна на скоростта (кадри/сек) на анимацията" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "(empty)" -msgstr "" +msgstr "(празно)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Move Frame" @@ -7645,7 +7705,7 @@ msgstr "Скорост:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Loop" -msgstr "" +msgstr "Повтаряне" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Animation Frames:" @@ -7661,11 +7721,11 @@ msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (Before)" -msgstr "" +msgstr "Вмъкване на празен (преди)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (After)" -msgstr "" +msgstr "Вмъкване на празен (след)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Move (Before)" @@ -7673,7 +7733,7 @@ msgstr "Преместване (преди)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Move (After)" -msgstr "" +msgstr "Преместване (след)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Select Frames" @@ -7681,11 +7741,11 @@ msgstr "Избиране на кадри" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Horizontal:" -msgstr "" +msgstr "Хоризонтала:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Vertical:" -msgstr "" +msgstr "Вертикала:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Select/Clear All Frames" @@ -7705,40 +7765,40 @@ msgstr "" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Set Margin" -msgstr "" +msgstr "Задаване на отстъп" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Snap Mode:" -msgstr "" +msgstr "Режим на прилепване:" #: editor/plugins/texture_region_editor_plugin.cpp #: scene/resources/visual_shader.cpp msgid "None" -msgstr "" +msgstr "Няма" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Pixel Snap" -msgstr "" +msgstr "Прилепване към пикселите" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Grid Snap" -msgstr "" +msgstr "Прилепване към решетката" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Auto Slice" -msgstr "" +msgstr "Автоматично отрязване" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Offset:" -msgstr "" +msgstr "Отместване:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Step:" -msgstr "" +msgstr "Стъпка:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Sep.:" -msgstr "" +msgstr "Разделител:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "TextureRegion" @@ -7746,15 +7806,15 @@ msgstr "Текстурна област" #: editor/plugins/theme_editor_plugin.cpp msgid "Add All Items" -msgstr "" +msgstr "Добавяне на всички елементи" #: editor/plugins/theme_editor_plugin.cpp msgid "Add All" -msgstr "" +msgstr "Добавяне на всичко" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove All Items" -msgstr "" +msgstr "Премахване на всички елементи" #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp msgid "Remove All" @@ -7766,7 +7826,7 @@ msgstr "Редактиране на темата" #: editor/plugins/theme_editor_plugin.cpp msgid "Theme editing menu." -msgstr "" +msgstr "Меню за редактиране на темата." #: editor/plugins/theme_editor_plugin.cpp msgid "Add Class Items" @@ -7798,7 +7858,7 @@ msgstr "Заключен бутон" #: editor/plugins/theme_editor_plugin.cpp msgid "Item" -msgstr "" +msgstr "Елемент" #: editor/plugins/theme_editor_plugin.cpp msgid "Disabled Item" @@ -7806,11 +7866,11 @@ msgstr "Заключен елемент" #: editor/plugins/theme_editor_plugin.cpp msgid "Check Item" -msgstr "" +msgstr "Елемент за отметка" #: editor/plugins/theme_editor_plugin.cpp msgid "Checked Item" -msgstr "" +msgstr "Отметнат елемент" #: editor/plugins/theme_editor_plugin.cpp msgid "Radio Item" @@ -7822,27 +7882,27 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "Named Sep." -msgstr "" +msgstr "Именуван разд." #: editor/plugins/theme_editor_plugin.cpp msgid "Submenu" -msgstr "" +msgstr "Подменю" #: editor/plugins/theme_editor_plugin.cpp msgid "Subitem 1" -msgstr "" +msgstr "Поделемент 1" #: editor/plugins/theme_editor_plugin.cpp msgid "Subitem 2" -msgstr "" +msgstr "Поделемент 2" #: editor/plugins/theme_editor_plugin.cpp msgid "Has" -msgstr "" +msgstr "Има" #: editor/plugins/theme_editor_plugin.cpp msgid "Many" -msgstr "" +msgstr "Много" #: editor/plugins/theme_editor_plugin.cpp msgid "Disabled LineEdit" @@ -7850,15 +7910,15 @@ msgstr "Заключено текстово поле" #: editor/plugins/theme_editor_plugin.cpp msgid "Tab 1" -msgstr "" +msgstr "Раздел 1" #: editor/plugins/theme_editor_plugin.cpp msgid "Tab 2" -msgstr "" +msgstr "Раздел 2" #: editor/plugins/theme_editor_plugin.cpp msgid "Tab 3" -msgstr "" +msgstr "Раздел 3" #: editor/plugins/theme_editor_plugin.cpp msgid "Editable Item" @@ -7866,32 +7926,32 @@ msgstr "Редактируем елемент" #: editor/plugins/theme_editor_plugin.cpp msgid "Subtree" -msgstr "" +msgstr "Поддърво" #: editor/plugins/theme_editor_plugin.cpp msgid "Has,Many,Options" -msgstr "" +msgstr "Има,Много,Опции" #: editor/plugins/theme_editor_plugin.cpp msgid "Data Type:" -msgstr "" +msgstr "Тип на данните:" #: editor/plugins/theme_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp msgid "Icon" -msgstr "" +msgstr "Иконка" #: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp msgid "Style" -msgstr "" +msgstr "Стил" #: editor/plugins/theme_editor_plugin.cpp msgid "Font" -msgstr "" +msgstr "Шрифт" #: editor/plugins/theme_editor_plugin.cpp msgid "Color" -msgstr "" +msgstr "Цват" #: editor/plugins/theme_editor_plugin.cpp msgid "Theme File" @@ -7899,11 +7959,11 @@ msgstr "Файл с тема" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase Selection" -msgstr "" +msgstr "Изтриване на избраното" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Fix Invalid Tiles" -msgstr "" +msgstr "Поправка на неправилните плочки" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -9642,6 +9702,11 @@ msgid "Projects" msgstr "Проекти" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "Зареждане…" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10002,6 +10067,11 @@ msgstr "" msgid "Plugins" msgstr "Приставки" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Внасяне на преводи" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10245,6 +10315,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Поставяне на възлите" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Разкачане на скрипта" @@ -10365,6 +10444,11 @@ msgid "Attach Script" msgstr "Закачане на скрипт" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Изрязване на възлите" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -11156,6 +11240,8 @@ msgstr "Филтриране на полигонните мрежи" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Give a MeshLibrary resource to this GridMap to use its meshes." msgstr "" +"Задайте ресурс от тип MeshLibrary в този GridMap, за да можете да използвате " +"полигонните му мрежи." #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Begin Bake" @@ -11196,11 +11282,11 @@ msgstr "" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Bake NavMesh" -msgstr "" +msgstr "Изпичане на NavMesh" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Clear the navigation mesh." -msgstr "" +msgstr "Изчистване на навигационната полигонна мрежа." #: modules/recast/navigation_mesh_generator.cpp msgid "Setting up Configuration..." @@ -11236,15 +11322,15 @@ msgstr "" #: modules/recast/navigation_mesh_generator.cpp msgid "Creating polymesh..." -msgstr "" +msgstr "Създаване на полигонна мрежа…" #: modules/recast/navigation_mesh_generator.cpp msgid "Converting to native navigation mesh..." -msgstr "" +msgstr "Преобразуване на навигационната полигонна мрежа в собствения формат…" #: modules/recast/navigation_mesh_generator.cpp msgid "Navigation Mesh Generator Setup:" -msgstr "" +msgstr "Настройка на генератора на навигационни полигонни мрежи:" #: modules/recast/navigation_mesh_generator.cpp msgid "Parsing Geometry..." @@ -11959,6 +12045,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Празен CollisionPolygon2D не влияе на колизиите." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12147,7 +12241,7 @@ msgstr "" #: scene/3d/baked_lightmap.cpp msgid "Finding meshes and lights" -msgstr "" +msgstr "Търсене на полигонни мрежи и светлини" #: scene/3d/baked_lightmap.cpp msgid "Preparing geometry (%d/%d)" @@ -12215,7 +12309,7 @@ msgstr "" #: scene/3d/cpu_particles.cpp msgid "Nothing is visible because no mesh has been assigned." -msgstr "" +msgstr "Не се вижда нищо, той като няма зададена полигонна мрежа." #: scene/3d/cpu_particles.cpp msgid "" @@ -12225,7 +12319,7 @@ msgstr "" #: scene/3d/gi_probe.cpp msgid "Plotting Meshes" -msgstr "" +msgstr "Построяване на полигонните мрежи" #: scene/3d/gi_probe.cpp msgid "Finishing Plot" @@ -12237,11 +12331,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -12249,12 +12338,16 @@ msgstr "" #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" +"Трябва да се зададе или създаде ресурс от тип NavigationMesh, за може да " +"работи този възел." #: scene/3d/navigation_mesh.cpp msgid "" "NavigationMeshInstance must be a child or grandchild to a Navigation node. " "It only provides navigation data." msgstr "" +"NavigationMeshInstance трябва да бъде дъщерен или под-дъщерен на възел от " +"тип Navigation. Той само предоставя данните за навигирането." #: scene/3d/particles.cpp msgid "" @@ -12267,6 +12360,8 @@ msgstr "" msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" +"Не се вижда нищо, тъй като полигонните мрежи не са били свързани към стъпки " +"на изчертаване." #: scene/3d/particles.cpp msgid "" @@ -12321,7 +12416,7 @@ msgstr "" #: scene/3d/soft_body.cpp msgid "This body will be ignored until you set a mesh." -msgstr "" +msgstr "Това тяло ще бъде игнорирано, докато не зададете полигонна мрежа." #: scene/3d/soft_body.cpp msgid "" @@ -12827,9 +12922,6 @@ msgstr "Константите не могат да бъдат променен #~ msgid "Import Large Texture" #~ msgstr "Внасяне на голяма текстура" -#~ msgid "Import Translations" -#~ msgstr "Внасяне на преводи" - #~ msgid "Couldn't import!" #~ msgstr "Неуспешно внасяне!" diff --git a/editor/translations/bn.po b/editor/translations/bn.po index 4482328985..ca8fff0724 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -8,14 +8,14 @@ # Tawhid H. <Tawhidk757@yahoo.com>, 2019. # Hasibul Hasan <hasibeng78@gmail.com>, 2019. # Oymate <dhruboadittya96@gmail.com>, 2020. -# Mokarrom Hossain <mhb2016.bzs@gmail.com>, 2020. +# Mokarrom Hossain <mhb2016.bzs@gmail.com>, 2020, 2021. # Sagen Soren <sagensoren03@gmail.com>, 2020. # Hasibul Hasan <d1hasib@yahoo.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-12-27 02:25+0000\n" +"PO-Revision-Date: 2021-02-15 10:51+0000\n" "Last-Translator: Mokarrom Hossain <mhb2016.bzs@gmail.com>\n" "Language-Team: Bengali <https://hosted.weblate.org/projects/godot-engine/" "godot/bn/>\n" @@ -24,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 4.4.1-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -268,7 +268,6 @@ msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" msgstr "লুপ Wrap মোড (লুপ দিয়ে শুরু দিয়ে ইন্টারপোলেট শেষ)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Remove this track." msgstr "নির্বাচিত ট্র্যাক/পথ অপসারণ করুন।" @@ -440,28 +439,24 @@ msgid "Track is not of type Spatial, can't insert key" msgstr "ট্র্যাক Spatial টাইপের নয়, কী সন্নিবেশ করতে পারে না" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Transform Track Key" -msgstr "রুপান্তরের ধরণ" +msgstr "ট্রান্সফর্ম ট্র্যাক কী যুক্ত করুন" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Track Key" -msgstr "অ্যানিমেশন (Anim) ট্র্যাক যোগ করুন" +msgstr "ট্র্যাক কী যুক্ত করুন" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a method key." -msgstr "" +msgstr "ট্র্যাক পাথটি অবৈধ, সুতরাং কোনও পদ্ধতি key যুক্ত করতে পারে না।" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Method Track Key" -msgstr "অ্যানিমেশনে (Anim) ট্র্যাক/পথ এবং চাবি যোগ করুন" +msgstr "Method Track Key যুক্ত করুন" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Method not found in object: " -msgstr "স্ক্রিপ্টে চলক-প্রাপক (VariableGet) পাওয়া যায়নি: " +msgstr "Object এ Method পাওয়া যায় নি: " #: editor/animation_track_editor.cpp msgid "Anim Move Keys" @@ -472,7 +467,6 @@ msgid "Clipboard is empty" msgstr "ক্লীপবোর্ড খালি" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Paste Tracks" msgstr "মানসমূহ প্রতিলেপন/পেস্ট করুন" @@ -484,6 +478,7 @@ msgstr "অ্যানিমেশনের (Anim) চাবিসমূহে msgid "" "This option does not work for Bezier editing, as it's only a single track." msgstr "" +"এই বিকল্পটি বেজিয়ার সম্পাদনার জন্য কাজ করে না, কারণ এটি কেবলমাত্র Single ট্র্যাক।" #: editor/animation_track_editor.cpp msgid "" @@ -497,24 +492,31 @@ msgid "" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" +"এই অ্যানিমেশনটি আমদানি করা দৃশ্যের সাথে সম্পর্কিত, তাই আমদানি করা ট্র্যাকগুলিতে " +"পরিবর্তনগুলি সংরক্ষণ করা হবে না।\n" +"\n" +"কাস্টম ট্র্যাক যুক্ত করার ক্ষমতা সক্ষম করতে, দৃশ্যের আমদানি সেটিংসে নেভিগেট করুন এবং " +"সেট করুন\n" +"\"ফাইলগুলি\" এ \"অ্যানিমেশন> সঞ্চয়স্থান\", \"অ্যানিমেশন> কাস্টম ট্র্যাক রাখুন\" সক্ষম " +"করুন, তারপরে পুনরায় আমদানি করুন।\n" +"বিকল্পভাবে, একটি আমদানি প্রিসেট ব্যবহার করুন যা পৃথক ফাইলগুলিতে অ্যানিমেশনগুলি " +"আমদানি করে।" #: editor/animation_track_editor.cpp msgid "Warning: Editing imported animation" -msgstr "" +msgstr "সতর্কতা: Imported অ্যানিমেশন সম্পাদনা করা হচ্ছে" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select an AnimationPlayer node to create and edit animations." -msgstr "" -"অ্যানিমেশনসমূহ সম্পাদন করতে দৃশ্যের তালিকা থেকে একটি AnimationPlayer নির্বাচন করুন।" +msgstr "অ্যানিমেশন তৈরি এবং সম্পাদনা করতে একটি অ্যানিমেশনপ্লেয়ার নোড নির্বাচন করুন।" #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." -msgstr "" +msgstr "Tree মধ্যে নির্বাচিত নোডগুলি থেকে কেবল ট্র্যাকগুলি দেখান।" #: editor/animation_track_editor.cpp msgid "Group tracks by node or display them as plain list." -msgstr "" +msgstr "নোড দ্বারা গ্রুপ ট্র্যাক করুন বা তাদের সরল তালিকা হিসাবে প্রদর্শন করুন।" #: editor/animation_track_editor.cpp msgid "Snap:" @@ -548,9 +550,8 @@ msgid "Animation properties." msgstr "অ্যানিমেশন বৈশিষ্ট্য।" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Copy Tracks" -msgstr "মানসমূহ প্রতিলিপি/কপি করুন" +msgstr "ট্র্যাকগুলি অনুলিপি করুন" #: editor/animation_track_editor.cpp msgid "Scale Selection" @@ -569,9 +570,8 @@ msgid "Duplicate Transposed" msgstr "পক্ষান্তরিত (Transposed) সমূহ অনুলিপি করুন" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Delete Selection" -msgstr "নির্বাচিত সমূহ অপসারণ করুন" +msgstr "নির্বাচিত সমূহ Delete করুন" #: editor/animation_track_editor.cpp msgid "Go to Next Step" @@ -595,7 +595,7 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Use Bezier Curves" -msgstr "" +msgstr "বেজিয়ার কার্ভ ব্যবহার করুন" #: editor/animation_track_editor.cpp msgid "Anim. Optimizer" @@ -642,16 +642,15 @@ msgid "Scale Ratio:" msgstr "স্কেল/মাপের অনুপাত:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "গুণাগুণ/বৈশিষ্ট্য বাছাই করুন" +msgstr "গুণাগুণ/বৈশিষ্ট্য copy করুন" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "প্রতিলিপি/কপি করুন" @@ -1487,14 +1486,12 @@ msgstr "" "পারবে না।" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing built-in type name." msgstr "" "অগ্রহনযোগ্য নাম। নামটি অবশ্যই বিদ্যমান পূর্বনির্মিত ধরণের নামের সাথে পরম্পরবিরোধী " "হতে পারবে না।" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing global constant name." msgstr "" "অগ্রহনযোগ্য নাম। নামটি অবশ্যই বিদ্যমান সার্বজনীন ধ্রুবকের নামের সাথে পরম্পরবিরোধী " @@ -1774,14 +1771,12 @@ msgid "Enabled Properties:" msgstr "প্রোপার্টি-সমূহ:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Features:" -msgstr "গঠনবিন্যাস" +msgstr "গঠনবিন্যাস :" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Classes:" -msgstr "ক্লাসের অনুসন্ধান করুন" +msgstr "Enabled ক্লাস:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." @@ -1931,8 +1926,8 @@ msgid "Open a File or Directory" msgstr "ফাইল বা পথ/ডিরেক্টরি খুলুন" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "সংরক্ষন করুন" @@ -2646,7 +2641,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "অ্যাড-অন প্লাগইন এনাবল করা সম্ভব হয় নি। কনফিগার পার্সিং ('%s') ব্যর্থ হয়েছে।" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "'res://addons/%s' লোকেশনে অ্যাড-অন প্লাগইনের স্ক্রিপ্ট ফাইল খুঁজে পাওয়া যায়নি।" @@ -3110,14 +3106,6 @@ msgid "Help" msgstr "হেল্প" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "অনুসন্ধান করুন" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp #, fuzzy msgid "Online Docs" @@ -3284,6 +3272,25 @@ msgstr "একটি স্ক্রিপ্ট খুলুন এবং চ #: editor/editor_node.cpp #, fuzzy +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"নিম্নোক্ত ফাইলসমূহ ডিস্কে নতুনতর।\n" +"কোন সিধান্তটি নেয়া উচিত হবে?:" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "রিলোড" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "পুনঃসংরক্ষণ" + +#: editor/editor_node.cpp +#, fuzzy msgid "New Inherited" msgstr "নতুন উত্তরাধিকারী দৃশ্য..." @@ -3509,7 +3516,7 @@ msgstr "বোন্/হাড় তৈরি করুন" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "প্রতিলেপন/পেস্ট করুন" @@ -4300,6 +4307,21 @@ msgstr "" msgid "Saving..." msgstr "সংরক্ষিত হচ্ছে..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "মোড (Mode) বাছাই করুন" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "ইম্পোর্ট" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "প্রাথমিক sRGB ব্যবহার করুন" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -5344,7 +5366,8 @@ msgid "Got:" msgstr "প্রাপ্ত:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "sha256 হ্যাশ চেক ব্যর্থ হয়েছে" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5460,7 +5483,6 @@ msgid "Sort:" msgstr "সাজান:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "বিভাগ:" @@ -7408,6 +7430,14 @@ msgstr "ডকুমেন্টসমূহ বন্ধ করুন" msgid "Run" msgstr "চালান" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "অনুসন্ধান করুন" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "পদার্পণ করুন" @@ -7464,16 +7494,6 @@ msgstr "" "নিম্নোক্ত ফাইলসমূহ ডিস্কে নতুনতর।\n" "কোন সিধান্তটি নেয়া উচিত হবে?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "রিলোড" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "পুনঃসংরক্ষণ" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "ডিবাগার" @@ -7576,8 +7596,8 @@ msgstr "বিন্দু অপসারণ করুন" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "কর্তন/কাট করুন" @@ -7823,6 +7843,11 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Size" +msgstr "সেল (Cell)-এর আকার:" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "অবজেক্ট আঁকা হয়েছে" @@ -10611,6 +10636,11 @@ msgid "Projects" msgstr "নতুন প্রকল্প" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "মিরর রিট্রাইভ করা হচ্ছে, দযা করে অপেক্ষা করুন..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10997,6 +11027,11 @@ msgstr "স্বয়ংক্রিয়-লোড" msgid "Plugins" msgstr "প্লাগইন-সমূহ" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "লোড ডিফল্ট" + #: editor/property_editor.cpp msgid "Preset..." msgstr "প্রিসেট..." @@ -11262,6 +11297,16 @@ msgstr "শীষ্য নোড ইন্সট্যান্স করুন #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "বাহিরের দৃশ্যের নোডে এটি করা সম্ভব হবে না!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "নোড-সমূহ প্রতিলেপন/পেস্ট করুন" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Detach Script" msgstr "স্ক্রিপ্ট সংযুক্ত করুন" @@ -11393,6 +11438,11 @@ msgid "Attach Script" msgstr "স্ক্রিপ্ট সংযুক্ত করুন" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "নোড-সমূহ কর্তন/কাট করুন" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "নোড(সমূহ) অপসারণ করুন" @@ -13173,6 +13223,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "সংঘর্ষে ফাঁকা/শুন্য CollisionPolygon2D-এর কোনো প্রভাব নেই।" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -13464,11 +13522,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -15409,9 +15462,6 @@ msgstr "" #~ msgid "Use Default Light" #~ msgstr "প্রাথমিক লাইট ব্যবহার করুন" -#~ msgid "Use Default sRGB" -#~ msgstr "প্রাথমিক sRGB ব্যবহার করুন" - #~ msgid "Default Light Normal:" #~ msgstr "লাইটের প্রাথমিক নরমাল:" diff --git a/editor/translations/br.po b/editor/translations/br.po index a20210c2bc..7600dd4eb1 100644 --- a/editor/translations/br.po +++ b/editor/translations/br.po @@ -643,7 +643,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1812,8 +1812,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -2447,7 +2447,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2837,14 +2837,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -2998,6 +2990,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3200,7 +3208,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3881,6 +3889,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4828,7 +4848,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4932,7 +4952,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6699,6 +6718,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6750,16 +6777,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -6852,8 +6869,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7074,6 +7091,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9594,6 +9615,10 @@ msgid "Projects" msgstr "" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -9954,6 +9979,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10197,6 +10226,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10317,6 +10354,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -11891,6 +11932,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12146,11 +12195,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/ca.po b/editor/translations/ca.po index ed171e7934..141f2cd58f 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -655,7 +655,7 @@ msgstr "Seleccioneu les Pistes a Copiar" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Copiar" @@ -1871,8 +1871,8 @@ msgid "Open a File or Directory" msgstr "Obre un Fitxer o Directori" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Desa" @@ -2547,7 +2547,8 @@ msgstr "" "configuració." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "No s'ha pogut trobar el camp d'Script per al complement a: 'res: // addons /" "%s'." @@ -2987,14 +2988,6 @@ msgid "Help" msgstr "Ajuda" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Cerca" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Documentació en línia" @@ -3166,6 +3159,25 @@ msgid "Open & Run a Script" msgstr "Obre i Executa un Script" #: editor/editor_node.cpp +#, fuzzy +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"El disc conté versions més recents dels fitxer següents. \n" +"Quina acció voleu seguir?:" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Torna a Carregar" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Torna a Desar" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Nou Heretat" @@ -3379,7 +3391,7 @@ msgstr "Fes-lo Únic" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Enganxa" @@ -4093,6 +4105,21 @@ msgstr "" msgid "Saving..." msgstr "Desant..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Mode de selecció" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importa" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Carrega Valors predeterminats" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Fitxers" @@ -5075,7 +5102,8 @@ msgid "Got:" msgstr "Rebut:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Ha fallat la comprovació del hash sha256" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5184,7 +5212,6 @@ msgid "Sort:" msgstr "Ordena:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Categoria:" @@ -7071,6 +7098,14 @@ msgstr "Tanca la Documentació" msgid "Run" msgstr "Executar" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Cerca" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Pas a Pas (per instruccions)" @@ -7124,16 +7159,6 @@ msgstr "" "El disc conté versions més recents dels fitxer següents. \n" "Quina acció voleu seguir?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Torna a Carregar" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Torna a Desar" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Depurador" @@ -7232,8 +7257,8 @@ msgstr "Punts d’interrupció" msgid "Go To" msgstr "Anar a" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Talla" @@ -7466,6 +7491,11 @@ msgid "Yaw" msgstr "Guinyada" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Size" +msgstr "Mida: " + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "Objectes Dibuixats" @@ -10292,6 +10322,11 @@ msgstr "Projecte" #: editor/project_manager.cpp #, fuzzy +msgid "Loading, please wait..." +msgstr "S'estan buscant rèpliques..." + +#: editor/project_manager.cpp +#, fuzzy msgid "Last Modified" msgstr "Última modificació" @@ -10664,6 +10699,11 @@ msgstr "Càrrega Automàtica" msgid "Plugins" msgstr "Connectors" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Carrega Valors predeterminats" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Configuració..." @@ -10925,6 +10965,16 @@ msgstr "Instancia una Escena Filla" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "No es pot operar en Nodes d'una escena externa!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Enganxa els Nodes" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Detach Script" msgstr "Adjunta-li un Script" @@ -11059,6 +11109,11 @@ msgid "Attach Script" msgstr "Adjunta-li un Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Talla els Nodes" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Elimina els Nodes" @@ -12791,6 +12846,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Un CollisionPolygon2D buit no té cap efecte en la col·lisió." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -13112,11 +13175,6 @@ msgstr "" "Les GIProbes no estan suportades pel controlador de vídeo GLES2.\n" "Utilitzeu un BakedLightmap en el seu lloc." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp #, fuzzy msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." diff --git a/editor/translations/cs.po b/editor/translations/cs.po index b37b7d15cd..2c21fc0e63 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -11,12 +11,12 @@ # zxey <r.hozak@seznam.cz>, 2018. # Vojtěch Šamla <auzkok@seznam.cz>, 2018, 2019, 2020, 2021. # Peeter Angelo <contact@peeterangelo.com>, 2019. -# VojtechBrezina <vojta.brezina@gmail.com>, 2019. +# VojtechBrezina <vojta.brezina@gmail.com>, 2019, 2021. # Garrom Orc Shaman <garromorcshaman@gmail.com>, 2019. # David Husička <davidek251@seznam.cz>, 2019. # Luboš Nečas <lubosnecas506@seznam.cz>, 2019. # David Kubeš <kubesdavid@email.cz>, 2019. -# Emil Jiří Tywoniak <emil.tywoniak@gmail.com>, 2020. +# Emil Jiří Tywoniak <emil.tywoniak@gmail.com>, 2020, 2021. # Filip Vincůrek <vincurek.f@gmail.com>, 2020. # Ondrej Pavelka <ondrej.pavelka@outlook.com>, 2020. # Zbyněk <zbynek.fiala@gmail.com>, 2020. @@ -28,7 +28,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-01-22 10:21+0000\n" +"PO-Revision-Date: 2021-03-08 15:33+0000\n" "Last-Translator: Václav Blažej <vaclavblazej@seznam.cz>\n" "Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot/" "cs/>\n" @@ -37,7 +37,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.5.1\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -186,11 +186,11 @@ msgstr "Animace: Změna času klíčových snímků" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Transition" -msgstr "Animace: změna přechodů" +msgstr "Animace: Změna přechodů" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Transform" -msgstr "Animace: změna transformací" +msgstr "Animace: Změna transformací" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Value" @@ -198,7 +198,7 @@ msgstr "Animace: Změnit hodnotu klíčových snímků" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Call" -msgstr "Animace: změna volání" +msgstr "Animace: Změna více volání" #: editor/animation_track_editor.cpp msgid "Change Animation Length" @@ -292,7 +292,7 @@ msgstr "Čas (s): " #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" -msgstr "Přepínací stopa povolena" +msgstr "Povolit stopu" #: editor/animation_track_editor.cpp msgid "Continuous" @@ -666,7 +666,7 @@ msgstr "Vybrat stopy ke kopírování" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopírovat" @@ -676,7 +676,7 @@ msgstr "Vybrat vše/nic" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" -msgstr "Přidat klip audio stopy" +msgstr "Přidat audio klip" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" @@ -1299,7 +1299,7 @@ msgstr "Přepnout bypass efektů na zvukové sběrnice" #: editor/editor_audio_buses.cpp msgid "Select Audio Bus Send" -msgstr "Vybrat přenos zvukové sběrnice" +msgstr "Vybrat cíl zvukové sběrnice" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus Effect" @@ -1867,8 +1867,8 @@ msgid "Open a File or Directory" msgstr "Otevřít soubor nebo složku" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Uložit" @@ -2477,7 +2477,7 @@ msgid "" "The current scene has unsaved changes.\n" "Reload the saved scene anyway? This action cannot be undone." msgstr "" -"Tato scéna obsahuje neuložené změny.\n" +"Aktuální scéna obsahuje neuložené změny.\n" "Přesto znovu načíst? Tuto akci nelze vrátit zpět." #: editor/editor_node.cpp @@ -2538,9 +2538,8 @@ msgstr "" "Nelze povolit rozšiřující plugin: '%s' parsování konfigurace se nezdařilo." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "" -"Nelze najít záznam skriptu pro rozšiřující plugin v: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "Nelze najít záznam skriptu pro rozšiřující plugin v: '%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2967,14 +2966,6 @@ msgid "Help" msgstr "Nápověda" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Hledat" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Online dokumentace" @@ -3139,6 +3130,24 @@ msgid "Open & Run a Script" msgstr "Otevřít a spustit skript" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"Následující soubory mají novější verzi na disku.\n" +"Jaká akce se má vykonat?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Znovu načíst" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Znovu uložit" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Nové zděděné" @@ -3349,7 +3358,7 @@ msgstr "Vytvořit unikátní" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Vložit" @@ -4052,6 +4061,21 @@ msgstr "Vrátili jste objekt, který dědí z Node metodou `post_import()`?" msgid "Saving..." msgstr "Ukládání..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Režim výběru" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Import" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Načíst výchozí" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d souborů" @@ -5014,8 +5038,8 @@ msgid "Got:" msgstr "Staženo:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" -msgstr "Neúspěšná kontrola sha256 hashe" +msgid "Failed SHA-256 hash check" +msgstr "Neúspěšná kontrola SHA-256 hashe" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5118,7 +5142,6 @@ msgid "Sort:" msgstr "Řadit podle:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategorie:" @@ -6289,9 +6312,8 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "Bod lze vložit pouze do process materiálu ParticlesMaterial" #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Convert to CPUParticles2D" -msgstr "Převést na CPUParticles" +msgstr "Převést na CPUParticles2D" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp @@ -6941,6 +6963,14 @@ msgstr "Zavřít dokumentaci" msgid "Run" msgstr "Spustit" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Hledat" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Vstoupit do" @@ -6994,16 +7024,6 @@ msgstr "" "Následující soubory mají novější verzi na disku.\n" "Jaká akce se má vykonat?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Znovu načíst" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Znovu uložit" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Ladicí program" @@ -7096,8 +7116,8 @@ msgstr "Breakpointy" msgid "Go To" msgstr "Přejít na" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Vyjmout" @@ -7320,6 +7340,11 @@ msgid "Yaw" msgstr "Náklon" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Size" +msgstr "Velikost: " + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "Objekty vykreslené" @@ -9990,6 +10015,10 @@ msgid "Projects" msgstr "Projekty" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "Načítání, prosím čekejte..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "Datum modifikace" @@ -10360,6 +10389,11 @@ msgstr "Autoload" msgid "Plugins" msgstr "Pluginy" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Načíst výchozí" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Předvolba..." @@ -10608,6 +10642,15 @@ msgid "Instance Child Scene" msgstr "Přidat instanci scény" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Nelze manipulovat s uzly z cizí scény!" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "Vložit uzly" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Odpojit skript" @@ -10734,6 +10777,10 @@ msgid "Attach Script" msgstr "Připojit skript" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "Vyjmout uzly" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Odstranit uzel/uzly" @@ -11540,29 +11587,25 @@ msgstr "Přiřaďte uzlu GridMap zdroj MeshLibrary k použití jeho sítě." #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Begin Bake" -msgstr "" +msgstr "Začít zapečení" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Preparing data structures" -msgstr "" +msgstr "Připravování datových struktur" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Generate buffers" -msgstr "Vygenerovat AABB" +msgstr "Vygenerovat buffery" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Direct lighting" -msgstr "Směry" +msgstr "Přímé osvětlení" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Indirect lighting" -msgstr "Odsadit zprava" +msgstr "Nepřímé osvětlení" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Post processing" msgstr "Následné zpracování" @@ -12076,9 +12119,8 @@ msgid "Select device from the list" msgstr "Vyberte zařízení ze seznamu" #: platform/android/export/export.cpp -#, fuzzy msgid "Unable to find the 'apksigner' tool." -msgstr "Nelze najít nástroj zipalign." +msgstr "Nelze najít nástroj 'apksigner'." #: platform/android/export/export.cpp msgid "" @@ -12100,14 +12142,12 @@ msgstr "" "Úložiště klíčů pro vydání je nakonfigurováno nesprávně v profilu exportu." #: platform/android/export/export.cpp -#, fuzzy msgid "A valid Android SDK path is required in Editor Settings." -msgstr "Nesprávná cesta Android SDK pro vlastní sestavení v Nastavení editoru." +msgstr "Je vyžadována platná cesta Android SDK v Nastavení editoru." #: platform/android/export/export.cpp -#, fuzzy msgid "Invalid Android SDK path in Editor Settings." -msgstr "Nesprávná cesta Android SDK pro vlastní sestavení v Nastavení editoru." +msgstr "Neplatná cesta k Android SDK v Nastavení editoru." #: platform/android/export/export.cpp msgid "Missing 'platform-tools' directory!" @@ -12115,12 +12155,11 @@ msgstr "Chybí složka \"platform-tools\"!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK platform-tools' adb command." -msgstr "" +msgstr "Nelze najít příkaz adb z nástrojů platformy Android SDK." #: platform/android/export/export.cpp -#, fuzzy msgid "Please check in the Android SDK directory specified in Editor Settings." -msgstr "Nesprávná cesta Android SDK pro vlastní sestavení v Nastavení editoru." +msgstr "Zkontrolujte ve složce Android SDK uvedené v Nastavení editoru." #: platform/android/export/export.cpp msgid "Missing 'build-tools' directory!" @@ -12128,7 +12167,7 @@ msgstr "Chybí složka \"build-tools\"!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK build-tools' apksigner command." -msgstr "" +msgstr "Nelze najít apksigner, nástrojů Android SDK." #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." @@ -12386,6 +12425,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Prázdný CollisionPolygon2D nemá při kolizi žádný efekt." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12589,27 +12636,23 @@ msgstr "ARVROrigin musí mít uzel ARVRCamera jako potomka." #: scene/3d/baked_lightmap.cpp msgid "Finding meshes and lights" -msgstr "" +msgstr "Hledat mřížky a světla" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing geometry (%d/%d)" -msgstr "Parsuji geometrii..." +msgstr "Připravuji geometrii (%d/%d)" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing environment" -msgstr "Zobrazit prostředí" +msgstr "Připravuji prostředí" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Generating capture" -msgstr "Generování světelné mapy" +msgstr "Generování snímání" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Saving lightmaps" -msgstr "Generování světelné mapy" +msgstr "Ukládám světelné mapy" #: scene/3d/baked_lightmap.cpp msgid "Done" @@ -12699,11 +12742,6 @@ msgstr "" "Video driver GLES2 nepodporuje GIProby.\n" "Místo toho použijte BakedLightmap." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "Uzel InterpolatedCamera je zastaralý a bude odstraněn v Godot 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "SpotLight s úhlem širším než 90 stupňů nemůže vrhat stíny." @@ -13041,6 +13079,10 @@ msgstr "Odlišnosti mohou být přiřazeny pouze ve vertex funkci." msgid "Constants cannot be modified." msgstr "Konstanty není možné upravovat." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "Uzel InterpolatedCamera je zastaralý a bude odstraněn v Godot 4.0." + #~ msgid "No" #~ msgstr "Ne" diff --git a/editor/translations/da.po b/editor/translations/da.po index 1a461ad0f4..72b2bf0e81 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -15,15 +15,15 @@ # Mads K. Bredager <mbredager@gmail.com>, 2019. # Kristoffer Andersen <kjaa@google.com>, 2019. # Joe Osborne <reachjoe.o@gmail.com>, 2020. -# Autowinto <happymansi@hotmail.com>, 2020. +# Autowinto <happymansi@hotmail.com>, 2020, 2021. # Mikkel Mouridsen <mikkelmouridsen@me.com>, 2020, 2021. # snakatk <snaqii@live.dk>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-01-26 16:32+0000\n" -"Last-Translator: Mikkel Mouridsen <mikkelmouridsen@me.com>\n" +"PO-Revision-Date: 2021-03-16 10:40+0000\n" +"Last-Translator: snakatk <snaqii@live.dk>\n" "Language-Team: Danish <https://hosted.weblate.org/projects/godot-engine/" "godot/da/>\n" "Language: da\n" @@ -31,7 +31,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 4.5-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -142,7 +142,7 @@ msgstr "Tilføj Bezier-punkt" #: editor/animation_bezier_editor.cpp msgid "Move Bezier Points" -msgstr "Flyt punkt" +msgstr "Flyt Bezier-punkter" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" @@ -198,9 +198,8 @@ msgid "Anim Multi Change Call" msgstr "Anim Skift Call" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Change Animation Length" -msgstr "Ændre Animation Navn:" +msgstr "Ændre Animationslængde" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -681,7 +680,7 @@ msgstr "Vælg spor til kopiering:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopier" @@ -1649,16 +1648,22 @@ msgid "Packing" msgstr "Pakker" #: editor/editor_export.cpp +#, fuzzy msgid "" "Target platform requires 'ETC' texture compression for GLES2. Enable 'Import " "Etc' in Project Settings." msgstr "" +"Målplatform kræver 'ETC' teksturkomprimering for GLES2. Aktivér 'Import Etc' " +"i Projektindstillingerne." #: editor/editor_export.cpp +#, fuzzy msgid "" "Target platform requires 'ETC2' texture compression for GLES3. Enable " "'Import Etc 2' in Project Settings." msgstr "" +"Målplatform kræver 'ETC2' teksturkomprimering for GLES3. Aktivér 'Import Etc " +"2' i Projektindstillingerne." #: editor/editor_export.cpp msgid "" @@ -1691,15 +1696,14 @@ 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 "Skabelonfil ikke fundet:" +msgstr "Brugerdefineret debug skabelonfil ikke fundet:" #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp msgid "Custom release template not found." -msgstr "" +msgstr "Brugerdefineret release skabelonfil ikke fundet." #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:" @@ -1744,13 +1748,12 @@ msgid "Import Dock" msgstr "Importer" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Erase profile '%s'? (no undo)" -msgstr "Erstat Alle" +msgstr "Slet profil '%s'? (kan ikke fortrydes)" #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" -msgstr "" +msgstr "Profil skal være et gyldigt filnavn og må ikke indeholde '.'" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1829,7 +1832,7 @@ msgstr "(Nuværende)" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/version_control_editor_plugin.cpp msgid "New" -msgstr "" +msgstr "Ny" #: editor/editor_feature_profile.cpp editor/editor_node.cpp #: editor/project_manager.cpp @@ -1939,8 +1942,8 @@ msgid "Open a File or Directory" msgstr "Åben en Fil eller Mappe" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Gem" @@ -2627,7 +2630,8 @@ msgstr "" "mislykkedes." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "Kan ikke finde scriptfelt for addon plugin på: 'res://addons/%s'." #: editor/editor_node.cpp @@ -3073,14 +3077,6 @@ msgid "Help" msgstr "Hjælp" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Søg" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Online Dokumentation" @@ -3241,6 +3237,23 @@ msgid "Open & Run a Script" msgstr "Åben & Kør et Script" #: editor/editor_node.cpp +#, fuzzy +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "De følgende filer kunne ikke trækkes ud af pakken:" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Ny Arved" @@ -3449,7 +3462,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Indsæt" @@ -4190,6 +4203,21 @@ msgstr "" msgid "Saving..." msgstr "Gemmer..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Vælg Node" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importer" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Indlæs Default" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Filer" @@ -5218,7 +5246,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5325,7 +5353,6 @@ msgid "Sort:" msgstr "Sorter:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategori:" @@ -7181,6 +7208,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Søg" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7234,16 +7269,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -7344,8 +7369,8 @@ msgstr "Slet points" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Cut" @@ -7584,6 +7609,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -10250,6 +10279,11 @@ msgid "Projects" msgstr "Projekt" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "Henter spejle, vent venligst ..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10622,6 +10656,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Indlæs Default" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Forudindstillet..." @@ -10877,6 +10916,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Indsæt Node" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Ryd Script" @@ -11007,6 +11055,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Indsæt Node" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -12700,6 +12753,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "En tom CollisionPolygon2D har ingen effekt på kollision." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12989,11 +13050,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13551,10 +13607,6 @@ msgstr "Konstanter kan ikke ændres." #~ msgid "Create folder" #~ msgstr "Opret mappe" -#, fuzzy -#~ msgid "Custom Node" -#~ msgstr "Indsæt Node" - #~ msgid "Invalid Path" #~ msgstr "Ugyldig sti" diff --git a/editor/translations/de.po b/editor/translations/de.po index d4f7db5298..ffd8a8874e 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -62,11 +62,16 @@ # Patric Wust <patric.wust@gmx.de>, 2020. # Jonathan Hassel <jonathan.hassel@icloud.com>, 2020. # Artur Schönfeld <schoenfeld.artur@ymail.com>, 2020. +# kidinashell <kidinashell@protonmail.com>, 2021. +# Daniel Glocker <mystboy666@gmail.com>, 2021. +# Raphipod <podraphi@googlemail.com>, 2021. +# Daniel Plaster <danimineiromc@googlemail.com>, 2021. +# El Captian <elcaptian@posteo.me>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-01-16 01:28+0000\n" +"PO-Revision-Date: 2021-03-09 04:13+0000\n" "Last-Translator: So Wieso <sowieso@dukun.de>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" @@ -75,7 +80,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 4.5-dev\n" +"X-Generator: Weblate 4.5.1\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -707,7 +712,7 @@ msgstr "Zu kopierende Spuren auswählen" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopieren" @@ -1920,8 +1925,8 @@ msgid "Open a File or Directory" msgstr "Datei oder Verzeichnis öffnen" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Speichern" @@ -2442,7 +2447,7 @@ msgid "" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" -"Dies ist ein nicht-lokales Objekt, Änderungen an ihm werden nicht " +"Dies ist ein Laufzeit-Objekt Objekt, Änderungen an ihm werden nicht " "gespeichert.\n" "Die Dokumentation zum Debugging beschreibt den nötigen Arbeitsablauf." @@ -2601,7 +2606,7 @@ msgstr "" "fehlgeschlagen." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Skript-Feld für Erweiterung in ‚res://addons/%s‘ konnte nicht gefunden " "werden." @@ -3042,14 +3047,6 @@ msgid "Help" msgstr "Hilfe" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Suchen" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Internetdokumentation" @@ -3068,7 +3065,7 @@ msgstr "Dokumentationsvorschläge senden" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" -msgstr "Community" +msgstr "Gemeinschaft" #: editor/editor_node.cpp msgid "About" @@ -3215,6 +3212,24 @@ msgid "Open & Run a Script" msgstr "Skript öffnen und ausführen" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"Die folgenden Dateien wurden im Dateisystem verändert.\n" +"Wie soll weiter vorgegangen werden?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Neu laden" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Erneut speichern" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Neu Geerbte" @@ -3426,7 +3441,7 @@ msgstr "Einzigartig machen" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Einfügen" @@ -4132,6 +4147,18 @@ msgstr "" msgid "Saving..." msgstr "Speichere..." +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "Importer auswählen" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "Importer:" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "Auf Standardwerte zurücksetzen" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Dateien" @@ -4895,7 +4922,7 @@ msgstr "Abspielmodus:" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "AnimationTree" -msgstr "AnimationTree" +msgstr "AnimationsBaum" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "New name:" @@ -5102,8 +5129,8 @@ msgid "Got:" msgstr "Erhalten:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" -msgstr "Sha256-Prüfung fehlgeschlagen" +msgid "Failed SHA-256 hash check" +msgstr "Sha256 Checksummen prüfung fehlgeschlagen" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5206,7 +5233,6 @@ msgid "Sort:" msgstr "Sortiere:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategorie:" @@ -5261,7 +5287,7 @@ msgstr "" msgid "Failed determining lightmap size. Maximum lightmap size too small?" msgstr "" "Die Größe des Lightmaps kann nicht bestimmt werden. Möglicherweise ist die " -"maximale Lightmap-Größe zu klein." +"maximale Lightmap-Größe zu klein?" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" @@ -7042,6 +7068,14 @@ msgstr "Dokumentation schließen" msgid "Run" msgstr "Ausführen" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Suchen" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Hineinspringen" @@ -7095,16 +7129,6 @@ msgstr "" "Die folgenden Dateien wurden im Dateisystem verändert.\n" "Wie soll weiter vorgegangen werden?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Neu laden" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Erneut speichern" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Debugger" @@ -7200,8 +7224,8 @@ msgstr "Haltepunkte" msgid "Go To" msgstr "Springe zu" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Ausschneiden" @@ -7343,7 +7367,7 @@ msgstr "Knochen in Ruhe-Pose setzen" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" -msgstr "Skeleton2D" +msgstr "Skelett2D" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Make Rest Pose (From Bones)" @@ -7426,6 +7450,10 @@ msgid "Yaw" msgstr "Gieren" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "Größe" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "Gezeichnete Objekte" @@ -7447,7 +7475,7 @@ msgstr "Zeichenaufrufe" #: editor/plugins/spatial_editor_plugin.cpp msgid "Vertices" -msgstr "Vertices" +msgstr "Eckpunkte" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." @@ -8500,7 +8528,7 @@ msgstr "Keine Textur zum Entfernen ausgewählt." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from scene? This will overwrite all current tiles." -msgstr "Aus Szene erstellen? Alle aktuellen Kacheln werden überschrieben!" +msgstr "Aus Szene erstellen? Alle aktuellen Kacheln werden überschrieben." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from scene?" @@ -9634,7 +9662,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" -msgstr "VisualShader" +msgstr "VisuellerShader" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Edit Visual Property" @@ -10123,6 +10151,10 @@ msgid "Projects" msgstr "Projekte" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "Projekte werden geladen, bitte warten..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "Zuletzt bearbeitet" @@ -10495,6 +10527,10 @@ msgstr "Autoload" msgid "Plugins" msgstr "Erweiterungen" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "Standardwerte importieren" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Voreinstellungen..." @@ -10746,6 +10782,14 @@ msgid "Instance Child Scene" msgstr "Szene hier instantiieren" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "Einfügen der Wurzelnode in dieselbe Szene nicht möglich." + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "Node(s) einfügen" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Skript loslösen" @@ -10873,6 +10917,10 @@ msgid "Attach Script" msgstr "Skript hinzufügen" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "Node(s) trennen" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Entferne Node(s)" @@ -11512,7 +11560,7 @@ msgstr "Bibliotheken: " #: modules/gdnative/register_types.cpp msgid "GDNative" -msgstr "GDNative" +msgstr "GDNativ" #: modules/gdscript/gdscript_functions.cpp msgid "Step argument is zero!" @@ -12543,6 +12591,18 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Ein leeres CollisionPolygon2D hat keinen Effekt auf Kollisionen." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" +"Ungültiges Polygon. Mindestens drei Punkte werden im ‚Festkörper‘-Baumodus " +"benötigt." + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" +"Ungültiges Polygon. Mindestens zwei Punkte werden im ‚Segment‘-Baumodus " +"benötigt." + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12872,11 +12932,6 @@ msgstr "" "GIProbes werden vom GLES2-Videotreiber nicht unterstützt.\n" "BakedLightmaps können als Alternative verwendet werden." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera ist veraltet und wird in Godot 4.0 entfernt werden." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13235,6 +13290,11 @@ msgstr "Varyings können nur in Vertex-Funktion zugewiesen werden." msgid "Constants cannot be modified." msgstr "Konstanten können nicht verändert werden." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "" +#~ "InterpolatedCamera ist veraltet und wird in Godot 4.0 entfernt werden." + #~ msgid "No" #~ msgstr "Nein" @@ -15078,9 +15138,6 @@ msgstr "Konstanten können nicht verändert werden." #~ msgid "Use Default Light" #~ msgstr "Nutze Standardlicht" -#~ msgid "Use Default sRGB" -#~ msgstr "Nutze Standard-sRGB" - #~ msgid "Default Light Normal:" #~ msgstr "Standardlichtnormale:" diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index b9cf1e9087..d11d4f42ac 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -621,7 +621,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1790,8 +1790,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -2425,7 +2425,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2815,14 +2815,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -2976,6 +2968,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3178,7 +3186,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3859,6 +3867,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4806,7 +4826,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4910,7 +4930,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6677,6 +6696,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6728,16 +6755,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -6830,8 +6847,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7052,6 +7069,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9572,6 +9593,10 @@ msgid "Projects" msgstr "" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -9932,6 +9957,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10175,6 +10204,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10295,6 +10332,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -11869,6 +11910,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12124,11 +12173,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/el.po b/editor/translations/el.po index fee8490872..8cd3397399 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -10,12 +10,13 @@ # pandektis <pandektis@gmail.com>, 2020. # KostasMSC <kargyris@athtech.gr>, 2020. # lawfulRobot <czavantias@gmail.com>, 2020. +# Michalis <michalisntovas@yahoo.gr>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-09-30 12:32+0000\n" -"Last-Translator: lawfulRobot <czavantias@gmail.com>\n" +"PO-Revision-Date: 2021-03-03 15:50+0000\n" +"Last-Translator: Michalis <michalisntovas@yahoo.gr>\n" "Language-Team: Greek <https://hosted.weblate.org/projects/godot-engine/godot/" "el/>\n" "Language: el\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 4.3-dev\n" +"X-Generator: Weblate 4.5.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -656,7 +657,7 @@ msgstr "Επιλογή Κομματιών για Αντιγραφή" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Αντιγραφή" @@ -1866,8 +1867,8 @@ msgid "Open a File or Directory" msgstr "Άνοιγμα αρχείου ή φακέλου" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Αποθήκευση" @@ -1878,7 +1879,7 @@ msgstr "Αποθήκευση αρχείου" #: editor/editor_file_dialog.cpp msgid "Go Back" -msgstr "Πήγαινε πίσω" +msgstr "Επιστροφή" #: editor/editor_file_dialog.cpp msgid "Go Forward" @@ -2542,7 +2543,8 @@ msgstr "" "αρχείου ρύθμισης." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Αδύνατη η έυρεση του πεδίου 'script' για την πρόσθετη επέκταση στο: 'res://" "addons/%s'." @@ -2983,14 +2985,6 @@ msgid "Help" msgstr "Βοήθεια" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Αναζήτηση" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Ηλεκτρονική τεκμηρίωση" @@ -3158,6 +3152,25 @@ msgid "Open & Run a Script" msgstr "Άνοιξε & Τρέξε μία δέσμη ενεργειών" #: editor/editor_node.cpp +#, fuzzy +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"Τα ακόλουθα αρχεία είναι νεότερα στον δίσκο.\n" +"Τι δράση να ληφθεί;:" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Επαναφόρτωση" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Επαναποθήκευση" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Νέα κληρονομημένη" @@ -3368,7 +3381,7 @@ msgstr "Κάνε μοναδικό" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Επικόλληση" @@ -3905,7 +3918,7 @@ msgstr "Αντικατάσταση..." #: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp msgid "Cancel" -msgstr "Ακύρωση" +msgstr "Άκυρο" #: editor/find_in_files.cpp msgid "Find: " @@ -4075,6 +4088,21 @@ msgstr "" msgid "Saving..." msgstr "Αποθήκευση..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Επιλογή Λειτουργίας" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Εισαγωγή" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Χρήση προεπιλεγμένου sRGB" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d αρχεία" @@ -5045,7 +5073,8 @@ msgid "Got:" msgstr "Δοσμένο:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Η δοκιμή κατακερματισμού sha256 απέτυχε" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5149,7 +5178,6 @@ msgid "Sort:" msgstr "Ταξινόμηση:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Κατηγορία:" @@ -7000,6 +7028,14 @@ msgstr "Κλείσιμο Τεκμηρίωσης" msgid "Run" msgstr "Εκτέλεση" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Αναζήτηση" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Βήμα μέσα" @@ -7015,7 +7051,7 @@ msgstr "Διακοπή" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp #: editor/script_editor_debugger.cpp msgid "Continue" -msgstr "Συνέχιση" +msgstr "Συνέχεια" #: editor/plugins/script_editor_plugin.cpp msgid "Keep Debugger Open" @@ -7053,16 +7089,6 @@ msgstr "" "Τα ακόλουθα αρχεία είναι νεότερα στον δίσκο.\n" "Τι δράση να ληφθεί;:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Επαναφόρτωση" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Επαναποθήκευση" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Αποσφαλματωτής" @@ -7159,8 +7185,8 @@ msgstr "Σημεία Διακοπής" msgid "Go To" msgstr "Πήγαινε Σε" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Αποκοπή" @@ -7385,6 +7411,11 @@ msgid "Yaw" msgstr "Παρέκκλιση" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Size" +msgstr "Μέγεθος: " + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "Ζωγραφισμένα αντικείμενα" @@ -8645,7 +8676,7 @@ msgstr "Κανένα αρχείο δεν προστέθηκε στο στάδι #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit" -msgstr "Δέσμευση" +msgstr "Υποβολή" #: editor/plugins/version_control_editor_plugin.cpp msgid "VCS Addon is not initialized" @@ -10081,6 +10112,11 @@ msgid "Projects" msgstr "Έργα" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "Ανάκτηση δεδοένων κατοπτρισμού, παρακαλώ περιμένετε..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "Τελευταία Τροποποιημένα" @@ -10451,6 +10487,11 @@ msgstr "Αυτόματη φόρτωση" msgid "Plugins" msgstr "Πρόσθετα" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Φόρτωση προεπιλογής" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Διαμόρφωση..." @@ -10700,6 +10741,16 @@ msgid "Instance Child Scene" msgstr "Αρχικοποίηση σκηνής ως παιδί" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Δεν είναι δυνατή η λειτουργία σε κόμβους από ξένη σκηνή!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Επικόλληση κόμβων" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Αποσύνδεση Δέσμης Ενεργειών" @@ -10832,6 +10883,11 @@ msgid "Attach Script" msgstr "Σύνδεση Δέσμης Ενεργειών" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Αποκοπή κόμβων" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Αφαίρεση κόμβων" @@ -12510,6 +12566,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Ένα άδειο ColisionPollygon2D δεν επηρεάζει τη σύγκρουση." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12837,11 +12901,6 @@ msgstr "" "Τα GIProbes δεν υποστηρίζονται από το πρόγραμμα οδήγησης οθόνης GLES2.\n" "Εναλλακτικά, χρησιμοποιήστε ένα BakedLightmap." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "Η InterpolatedCamera έχει καταργηθεί και θα αφαιρεθεί στο Godot 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13189,6 +13248,11 @@ msgstr "Τα «varying» μπορούν να ανατεθούν μόνο στη msgid "Constants cannot be modified." msgstr "Οι σταθερές δεν μπορούν να τροποποιηθούν." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "" +#~ "Η InterpolatedCamera έχει καταργηθεί και θα αφαιρεθεί στο Godot 4.0." + #~ msgid "No" #~ msgstr "Όχι" @@ -15017,9 +15081,6 @@ msgstr "Οι σταθερές δεν μπορούν να τροποποιηθο #~ msgid "Use Default Light" #~ msgstr "Χρήση προεπιλεγμέου φωτός" -#~ msgid "Use Default sRGB" -#~ msgstr "Χρήση προεπιλεγμένου sRGB" - #~ msgid "Default Light Normal:" #~ msgstr "Προεπιλεγμένο διάνυσμα κανονικής ανάκλασης φωτός:" diff --git a/editor/translations/eo.po b/editor/translations/eo.po index bd5d35cf43..46e3a6b28d 100644 --- a/editor/translations/eo.po +++ b/editor/translations/eo.po @@ -10,18 +10,19 @@ # Sr Half <flavio05@outlook.com>, 2020. # Cristian Yepez <cristianyepez@gmail.com>, 2020. # BinotaLIU <me@binota.org>, 2020. +# Jakub Fabijan <animatorzPolski@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2020-11-20 23:08+0000\n" -"Last-Translator: BinotaLIU <me@binota.org>\n" +"PO-Revision-Date: 2021-02-21 10:51+0000\n" +"Last-Translator: Jakub Fabijan <animatorzPolski@gmail.com>\n" "Language-Team: Esperanto <https://hosted.weblate.org/projects/godot-engine/" "godot/eo/>\n" "Language: eo\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4-dev\n" +"X-Generator: Weblate 4.5\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -646,14 +647,13 @@ msgstr "Elekti vojetojn por duplikati" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Duplikati" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "Elektaro nur" +msgstr "Elekti Ĉiuj/Neniuj" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -1836,8 +1836,8 @@ msgid "Open a File or Directory" msgstr "Malfermi dosieron aŭ dosierujon" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Konservi" @@ -2491,7 +2491,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2911,14 +2911,6 @@ msgid "Help" msgstr "Helpo" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Serĉo" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp #, fuzzy msgid "Online Docs" @@ -3075,6 +3067,22 @@ msgid "Open & Run a Script" msgstr "Malfermi & ruli skripto" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3279,7 +3287,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3971,6 +3979,20 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Selektu nodo(j)n por enporti" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Enporti" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -4924,7 +4946,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5028,7 +5050,6 @@ msgid "Sort:" msgstr "Ordigi:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6806,6 +6827,14 @@ msgstr "" msgid "Run" msgstr "Ruli" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Serĉo" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6858,16 +6887,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -6960,8 +6979,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7183,6 +7202,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9727,6 +9750,10 @@ msgid "Projects" msgstr "Projektoj" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp #, fuzzy msgid "Last Modified" msgstr "Modifita" @@ -10088,6 +10115,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Enporti dokon" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10332,6 +10364,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Skali Elektaron" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Krei skripton" @@ -10456,6 +10497,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -12049,6 +12094,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12304,11 +12357,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/es.po b/editor/translations/es.po index 0b354dbd08..4f8441fbfc 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, 2020. +# Lisandro Lorea <lisandrolorea@gmail.com>, 2016-2017, 2019, 2020, 2021. # Lonsfor <lotharw@protonmail.com>, 2017-2018. # Mario Nachbaur <manachbaur@gmail.com>, 2018. # Oscar Carballal <oscar.carballal@protonmail.com>, 2017-2018. @@ -58,11 +58,12 @@ # Ricardo Pérez <ricpelo@gmail.com>, 2021. # A <kaieltroll@gmail.com>, 2021. # Lucasdelpiero <lucasdelpiero98@gmail.com>, 2021. +# SteamGoblin <SteamGoblin860@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-01-16 01:29+0000\n" +"PO-Revision-Date: 2021-03-10 22:14+0000\n" "Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" @@ -71,7 +72,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 4.5-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -577,7 +578,7 @@ msgstr "Agrupar las pistas por nodo o mostrarlas como una lista plana." #: editor/animation_track_editor.cpp msgid "Snap:" -msgstr "Snap:" +msgstr "Ajuste:" #: editor/animation_track_editor.cpp msgid "Animation step value." @@ -707,7 +708,7 @@ msgstr "Selecciona las Pistas a Copiar" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Copiar" @@ -1641,7 +1642,7 @@ msgid "" "Etc' in Project Settings." msgstr "" "La plataforma de destino requiere compresión de texturas 'ETC' para GLES2. " -"Activa 'Import Etc' en Ajustes del Proyecto." +"Activa 'Import Etc' en Configuración del Proyecto." #: editor/editor_export.cpp msgid "" @@ -1649,7 +1650,7 @@ msgid "" "'Import Etc 2' in Project Settings." msgstr "" "La plataforma de destino requiere compresión de texturas 'ETC2' para GLES3. " -"Activa 'Import Etc 2' en Ajustes del Proyecto." +"Activa 'Import Etc 2' en Configuración del Proyecto." #: editor/editor_export.cpp msgid "" @@ -1660,8 +1661,8 @@ msgid "" msgstr "" "La plataforma de destino requiere compresión de texturas 'ETC' para usar " "GLES2 como controlador de respaldo.\n" -"Activa 'Import Etc' en Ajustes del Proyecto, o desactiva 'Driver Fallback " -"Enabled'." +"Activa 'Import Etc' en Configuración del Proyecto, o desactiva 'Driver " +"Fallback Enabled'." #: editor/editor_export.cpp msgid "" @@ -1669,7 +1670,7 @@ msgid "" "'Import Pvrtc' in Project Settings." msgstr "" "La plataforma de destino requiere compresión de texturas 'PVRTC' para GLES2. " -"Activa 'Import Pvrtc' en Ajustes del Proyecto." +"Activa 'Import Pvrtc' en Configuración del Proyecto." #: editor/editor_export.cpp msgid "" @@ -1677,7 +1678,8 @@ msgid "" "Enable 'Import Etc 2' or 'Import Pvrtc' in Project Settings." msgstr "" "La plataforma de destino requiere compresión de texturas 'ETC2' o 'PVRTC' " -"para GLES3. Activa 'Import Etc 2' o 'Import Pvrtc' en Ajustes del Proyecto." +"para GLES3. Activa 'Import Etc 2' o 'Import Pvrtc' en Configuración del " +"Proyecto." #: editor/editor_export.cpp msgid "" @@ -1688,7 +1690,7 @@ msgid "" msgstr "" "La plataforma del objetivo requiere compresión de texturas 'PVRTC' para el " "driver fallback de GLES2.\n" -"Activa Import Pvrtc' en la Ajustes del Proyecto, o desactiva 'Driver " +"Activa Import Pvrtc' en Configuración del Proyecto, o desactiva 'Driver " "Fallback Enabled'." #: editor/editor_export.cpp platform/android/export/export.cpp @@ -1920,8 +1922,8 @@ msgid "Open a File or Directory" msgstr "Abrir un archivo o directorio" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Guardar" @@ -1992,7 +1994,7 @@ msgstr "Mostrar/Ocultar archivos ocultos." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails." -msgstr "Ver ítems como un grid de miniaturas." +msgstr "Ver ítems como una cuadrícula de miniaturas." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a list." @@ -2599,10 +2601,8 @@ msgstr "" "configuración de '%s'." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "" -"No se pudo encontrar el campo del script para el plugin addon en: 'res://" -"addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "No se pudo encontrar el campo script para el plugin de addon en: '%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2662,8 +2662,8 @@ msgid "" "category." msgstr "" "No se ha definido ninguna escena principal, ¿seleccionar una?\n" -"Es posible cambiarla más tarde en \"Ajustes del Proyecto\" bajo la categoría " -"'application'." +"Es posible cambiarla más tarde en \"Configuración del Proyecto\" bajo la " +"categoría 'application'." #: editor/editor_node.cpp msgid "" @@ -2672,8 +2672,8 @@ msgid "" "category." msgstr "" "La escena seleccionada '%s' no existe, ¿seleccionar una válida?\n" -"Es posible cambiarla más tarde en \"Ajustes del Proyecto\" bajo la categoría " -"'application'." +"Es posible cambiarla más tarde en \"Configuración del Proyecto\" bajo la " +"categoría 'application'." #: editor/editor_node.cpp msgid "" @@ -2683,8 +2683,8 @@ msgid "" msgstr "" "La escena '%s' seleccionada no es un archivo de escena, ¿seleccionar uno " "válido?\n" -"Es posible cambiarla más tarde en \"Ajustes del Proyecto\" bajo la categoría " -"'application'." +"Es posible cambiarla más tarde en \"Configuración del Proyecto\" bajo la " +"categoría 'application'." #: editor/editor_node.cpp msgid "Save Layout" @@ -2845,7 +2845,7 @@ msgstr "Proyecto" #: editor/editor_node.cpp msgid "Project Settings..." -msgstr "Ajustes del Proyecto..." +msgstr "Configuración del Proyecto..." #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Version Control" @@ -3039,14 +3039,6 @@ msgid "Help" msgstr "Ayuda" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Buscar" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Documentación Online" @@ -3214,6 +3206,24 @@ msgid "Open & Run a Script" msgstr "Abrir y Ejecutar un Script" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"Los siguientes archivos son nuevos en disco.\n" +"¿Qué acción se debería tomar?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Recargar" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Volver a Guardar" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Nueva Escena Heredada" @@ -3425,7 +3435,7 @@ msgstr "Hacer Único" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Pegar" @@ -3956,7 +3966,7 @@ msgid "" "ProjectSettings." msgstr "" "Incluye los archivos con las siguientes extensiones. Añádelos o elimínalos " -"en Ajustes del proyecto." +"en Configuración del Proyecto." #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -4134,6 +4144,18 @@ msgstr "¿Devolviste un objeto derivado de Node en el método `post_import()`?" msgid "Saving..." msgstr "Guardando..." +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "Seleccionar Importador" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "Importador:" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "Restablecer Valores por Defecto" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d archivos" @@ -4406,7 +4428,7 @@ msgstr "Seleccionar y mover puntos, crear puntos con clic derecho." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp msgid "Enable snap and show grid." -msgstr "Activar snap y mostrar grid." +msgstr "Activar ajuste y mostrar cuadrícula." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -5106,8 +5128,8 @@ msgid "Got:" msgstr "Tiene:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" -msgstr "Fallo en la comprobación del hash sha256" +msgid "Failed SHA-256 hash check" +msgstr "Fallo en la comprobación del hash SHA-256" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5210,7 +5232,6 @@ msgid "Sort:" msgstr "Ordenar:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Categoría:" @@ -5297,15 +5318,15 @@ msgstr "Vista Previa" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Configure Snap" -msgstr "Configurar Snap" +msgstr "Configurar Ajuste" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Grid Offset:" -msgstr "Grid Offset:" +msgstr "Desplazamiento de Cuadrícula:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Grid Step:" -msgstr "Grid Step:" +msgstr "Paso de Cuadrícula:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Primary Line Every:" @@ -5469,11 +5490,11 @@ msgstr "Ancho Inferior" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "VCenter Wide" -msgstr "Ancho Centro Vert." +msgstr "Centro Vert. Ancho" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "HCenter Wide" -msgstr "Ancho Centro Horiz." +msgstr "Centro Horiz. Ancho" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Full Rect" @@ -5633,48 +5654,48 @@ msgstr "Modo de Regla" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Toggle smart snapping." -msgstr "Alternar acople inteligente." +msgstr "Act./Desact. ajuste inteligente." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Smart Snap" -msgstr "Usar Snap Inteligente" +msgstr "Usar Ajuste Inteligente" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Toggle grid snapping." -msgstr "Act./Desact. grid snapping." +msgstr "Act./Desact. ajuste de cuadrícula." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Grid Snap" -msgstr "Usar Grid Snap" +msgstr "Usar Ajuste de Cuadrícula" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snapping Options" -msgstr "Opciones de Snapping" +msgstr "Opciones de Ajuste" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Rotation Snap" -msgstr "Usar Snap de Rotación" +msgstr "Usar Ajuste de Rotación" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Scale Snap" -msgstr "Usar Snap de Escalado" +msgstr "Usar Ajuste de Escalado" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" -msgstr "Snap Relativo" +msgstr "Ajuste Relativo" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Pixel Snap" -msgstr "Usar Pixel Snap" +msgstr "Usar Ajuste de Píxeles" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Smart Snapping" -msgstr "Snapping Inteligente" +msgstr "Ajuste Inteligente" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Configure Snap..." -msgstr "Configurar Snap..." +msgstr "Configurar Ajuste..." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Parent" @@ -5743,7 +5764,7 @@ msgstr "Ver" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Always Show Grid" -msgstr "Mostrar Siempre el Grid" +msgstr "Mostrar Siempre la Cuadrícula" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Helpers" @@ -5832,11 +5853,11 @@ msgstr "Limpiar Pose" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" -msgstr "Multiplicar grid step por 2" +msgstr "Multiplicar paso de cuadrícula por 2" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Divide grid step by 2" -msgstr "Dividir grid step por 2" +msgstr "Dividir paso de cuadrícula por 2" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Pan View" @@ -6753,43 +6774,43 @@ msgstr "Limpiar UV" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Settings" -msgstr "Configuración del Grid" +msgstr "Configuración de la Cuadrícula" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Snap" -msgstr "Snap" +msgstr "Ajuste" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Enable Snap" -msgstr "Activar Snap" +msgstr "Activar Ajuste" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid" -msgstr "Grid" +msgstr "Cuadrícula" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Show Grid" -msgstr "Ver Grid" +msgstr "Ver Cuadrícula" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Configure Grid:" -msgstr "Configurar Grid:" +msgstr "Configurar Cuadrícula:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Offset X:" -msgstr "Grid Offset X:" +msgstr "Desplazamiento de Cuadrícula en X:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Offset Y:" -msgstr "Grid Offset Y:" +msgstr "Desplazamiento de Cuadrícula en Y:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Step X:" -msgstr "Grid Step X:" +msgstr "Paso de Cuadrícula en X:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Step Y:" -msgstr "Grid Step Y:" +msgstr "Paso de Cuadrícula en Y:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Sync Bones to Polygon" @@ -7047,6 +7068,14 @@ msgstr "Cerrar Documentación" msgid "Run" msgstr "Ejecutar" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Buscar" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Entrar En" @@ -7100,16 +7129,6 @@ msgstr "" "Los siguientes archivos son nuevos en disco.\n" "¿Qué es lo que quieres hacer?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Recargar" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Volver a Guardar" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Depurador" @@ -7205,8 +7224,8 @@ msgstr "Breakpoints" msgid "Go To" msgstr "Ir A" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Cortar" @@ -7426,7 +7445,11 @@ msgstr "Altura" #: editor/plugins/spatial_editor_plugin.cpp msgid "Yaw" -msgstr "Yaw" +msgstr "Guiñada" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "Tamaño" #: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" @@ -7752,7 +7775,7 @@ msgstr "Ver Origen" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Grid" -msgstr "Ver Grid" +msgstr "Ver Cuadrícula" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -7761,19 +7784,19 @@ msgstr "Configuración..." #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" -msgstr "Ajustes de Snap" +msgstr "Configuración de Ajuste" #: editor/plugins/spatial_editor_plugin.cpp msgid "Translate Snap:" -msgstr "Snap de Traslación:" +msgstr "Ajuste de Traslación:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate Snap (deg.):" -msgstr "Snap de Rotación (grados):" +msgstr "Ajuste de Rotación (grados):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Snap (%):" -msgstr "Snap de Escala (%):" +msgstr "Ajuste de Escala (%):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Viewport Settings" @@ -8042,7 +8065,7 @@ msgstr "Asignar Margen" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Snap Mode:" -msgstr "Modo Snap:" +msgstr "Modo de Ajuste:" #: editor/plugins/texture_region_editor_plugin.cpp #: scene/resources/visual_shader.cpp @@ -8051,11 +8074,11 @@ msgstr "Ninguno" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Pixel Snap" -msgstr "Pixel Snap" +msgstr "Ajuste de Píxeles" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Grid Snap" -msgstr "Grid Snap" +msgstr "Ajuste de Cuadrícula" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Auto Slice" @@ -8473,7 +8496,8 @@ msgstr "Mantener el polígono dentro del region Rect." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Enable snap and show grid (configurable via the Inspector)." -msgstr "Activar snap y mostrar grid (configurable a través del Inspector)." +msgstr "" +"Activar ajuste y mostrar cuadrícula (configurable a través del Inspector)." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Display Tile Names (Hold Alt Key)" @@ -9664,7 +9688,7 @@ msgid "" msgstr "" "No se pudo exportar el proyecto para la plataforma '%s'.\n" "Esto puede ser debido a un problema de configuración en el preset de " -"exportación o en los ajustes de exportación." +"exportación o en la configuración de exportación." #: editor/project_export.cpp msgid "Release" @@ -10054,8 +10078,8 @@ msgid "" "the \"Application\" category." msgstr "" "No se puede ejecutar el proyecto: no hay una escena principal definida.\n" -"Por favor, edita el proyecto y configura la escena principal en los Ajustes " -"del proyecto, en la categoría \"Application\"." +"Por favor, edita el proyecto y configura la escena principal en " +"Configuración del Proyecto, en la categoría \"Application\"." #: editor/project_manager.cpp msgid "" @@ -10121,6 +10145,10 @@ msgid "Projects" msgstr "Proyectos" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "Cargando, espera por favor..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "Ultima Modificación" @@ -10397,7 +10425,7 @@ msgstr "Cambiar Modo de Filtro Local" #: editor/project_settings_editor.cpp msgid "Project Settings (project.godot)" -msgstr "Ajustes del Proyecto (project.godot)" +msgstr "Configuración del Proyecto (project.godot)" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "General" @@ -10491,6 +10519,10 @@ msgstr "AutoLoad" msgid "Plugins" msgstr "Plugins" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "Valores de Importación por Defecto" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Preset..." @@ -10741,6 +10773,14 @@ msgid "Instance Child Scene" msgstr "Instanciar Escena Hija" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "No se puede pegar el nodo raíz en la misma escena." + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "Pegar Nodo(s)" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Sustraer Script" @@ -10868,6 +10908,10 @@ msgid "Attach Script" msgstr "Añadir Script" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "Cortar Nodos(s)" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Eliminar Nodo(s)" @@ -11576,7 +11620,7 @@ msgstr "Plano:" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Delete Selection" -msgstr "GridMap Eliminar Seleccionados" +msgstr "Eliminar Selección de GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Fill Selection" @@ -11584,7 +11628,7 @@ msgstr "Rellenar Selección en GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Paste Selection" -msgstr "Pegar lo Seleccionado en GridMap" +msgstr "Pegar Selección en GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Paint" @@ -11592,7 +11636,7 @@ msgstr "Pintar GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Grid Map" -msgstr "Grid Map" +msgstr "Mapeo de Cuadrícula" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Snap View" @@ -11729,7 +11773,7 @@ msgstr "Estableciendo la configuración..." #: modules/recast/navigation_mesh_generator.cpp msgid "Calculating grid size..." -msgstr "Calculando tamaño de grid..." +msgstr "Calculando tamaño la cuadrícula..." #: modules/recast/navigation_mesh_generator.cpp msgid "Creating heightfield..." @@ -12554,6 +12598,18 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Un CollisionPolygon2D vacío no tiene ningún efecto en las colisiones." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" +"Polígono inválido. Se necesitan al menos 3 puntos en modo de construcción " +"'Solids'." + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" +"Polígono inválido. Se necesitan al menos 2 puntos en modo de construcción " +"'Segments'." + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12767,7 +12823,7 @@ msgstr "ARVROrigin requiere un nodo hijo ARVRCamera." #: scene/3d/baked_lightmap.cpp msgid "Finding meshes and lights" -msgstr "Encontrar mallas y luces" +msgstr "Encontrando mallas y luces" #: scene/3d/baked_lightmap.cpp msgid "Preparing geometry (%d/%d)" @@ -12874,11 +12930,6 @@ msgstr "" "Las GIProbes no están soportadas por el controlador de vídeo GLES2.\n" "Usa un BakedLightmap en su lugar." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera ha sido desaprobado y será eliminado en Godot 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13170,7 +13221,7 @@ msgid "" "Default Environment as specified in Project Settings (Rendering -> " "Environment -> Default Environment) could not be loaded." msgstr "" -"El Entorno por Defecto como se especifica en los Ajustes del Proyecto " +"El Entorno por Defecto como se especifica en Configuración del Proyecto " "(Rendering -> Environment -> Default Environment) no se ha podido cargar." #: scene/main/viewport.cpp @@ -13228,6 +13279,11 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice." msgid "Constants cannot be modified." msgstr "Las constantes no pueden modificarse." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "" +#~ "InterpolatedCamera ha sido desaprobado y será eliminado en Godot 4.0." + #~ msgid "No" #~ msgstr "No" @@ -15112,9 +15168,6 @@ msgstr "Las constantes no pueden modificarse." #~ msgid "Use Default Light" #~ msgstr "Usar iluminación predeterminada" -#~ msgid "Use Default sRGB" -#~ msgstr "Usar sRGB predeterminado" - #~ msgid "Default Light Normal:" #~ msgstr "Iluminación por normales predeterminada:" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index 4a3624c026..11e55b2dfa 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -3,7 +3,7 @@ # Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). # This file is distributed under the same license as the Godot source code. # Diego López <diegodario21@gmail.com>, 2017. -# Lisandro Lorea <lisandrolorea@gmail.com>, 2016-2018, 2019, 2020. +# Lisandro Lorea <lisandrolorea@gmail.com>, 2016-2018, 2019, 2020, 2021. # Roger Blanco Ribera <roger.blancoribera@gmail.com>, 2016-2018. # Sebastian Silva <sebastian@sugarlabs.org>, 2016. # Jose Luis Bossio <joseluisbossio@gmail.com>, 2018. @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-12-29 21:52+0000\n" +"PO-Revision-Date: 2021-03-09 04:13+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" @@ -30,7 +30,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 4.4.1-dev\n" +"X-Generator: Weblate 4.5.1\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -664,7 +664,7 @@ msgstr "Elegir Pistas a Copiar" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Copiar" @@ -1876,8 +1876,8 @@ msgid "Open a File or Directory" msgstr "Abrir un Archivo o Directorio" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Guardar" @@ -2408,7 +2408,7 @@ msgstr "No hay escena definida para ejecutar." #: editor/editor_node.cpp msgid "Save scene before running..." -msgstr "" +msgstr "Guardar escena antes de ejecutar..." #: editor/editor_node.cpp msgid "Could not start subprocess!" @@ -2556,10 +2556,8 @@ msgstr "" "configuración." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "" -"No se pudo encontrar el campo script para el plugin de addon en: 'res://" -"addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "No se pudo encontrar el campo script para el plugin de addon en: '%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2994,14 +2992,6 @@ msgid "Help" msgstr "Ayuda" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Buscar" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Documentación Online" @@ -3169,6 +3159,24 @@ msgid "Open & Run a Script" msgstr "Abrir y Correr un Script" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"Los siguientes archivos son nuevos en disco.\n" +"¿Qué acción se debería tomar?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Volver a Cargar" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Volver a Guardar" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Nuevo Heredado" @@ -3379,7 +3387,7 @@ msgstr "Convertir en Unico" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Pegar" @@ -4087,6 +4095,18 @@ msgstr "¿Devolviste un objeto derivado de Node en el método `post_import()`?" msgid "Saving..." msgstr "Guardando..." +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "Seleccionar Importador" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "Importador:" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "Restablecer Valores Por Defecto" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Archivos" @@ -5060,8 +5080,8 @@ msgid "Got:" msgstr "Recibido:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" -msgstr "Fallo el chequeo del hash sha256" +msgid "Failed SHA-256 hash check" +msgstr "Fallo el chequeo del hash SHA-256" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5164,7 +5184,6 @@ msgid "Sort:" msgstr "Ordenar:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Categoría:" @@ -5193,14 +5212,13 @@ msgid "Assets ZIP File" msgstr "Archivo ZIP de Assets" #: editor/plugins/baked_lightmap_editor_plugin.cpp -#, fuzzy msgid "" "Can't determine a save path for lightmap images.\n" "Save your scene and try again." msgstr "" -"No se pudo determinar una ruta de guardado para las imagenes de lightmap.\n" -"Guardá tu escena (para imagenes a ser guardadas en el mismo directorio), o " -"elegí una ruta de guardado desde las propiedades de BakedLightmap." +"No se puede determinar una ruta de guardado para las imágenes de los " +"lightmaps.\n" +"Guardá tu escena e inténtalo de nuevo." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" @@ -5219,26 +5237,31 @@ msgstr "" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed determining lightmap size. Maximum lightmap size too small?" msgstr "" +"Falló al determinar el tamaño del lightmap ¿El tamaño máximo de lightmap es " +"demasiado pequeño?" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" "Some mesh is invalid. Make sure the UV2 channel values are contained within " "the [0.0,1.0] square region." msgstr "" +"Alguna malla es inválida. Asegurate de que los valores del canal UV2 estén " +"contenidos dentro de la región cuadrada [0,0,1,0]." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" "Godot editor was built without ray tracing support, lightmaps can't be baked." msgstr "" +"El editor de Godot se compiló sin soporte de ray tracing, los lightmaps no " +"pueden ser bakeados." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Bake Lightmaps" msgstr "Bake Lightmaps" #: editor/plugins/baked_lightmap_editor_plugin.cpp -#, fuzzy msgid "Select lightmap bake file:" -msgstr "Elegir Archivo de Plantilla" +msgstr "Selecciona un archivo de lightmap bakeado:" #: editor/plugins/camera_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6336,9 +6359,8 @@ msgstr "" "Solo se puede setear un punto en un material de proceso ParticlesMaterial" #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Convert to CPUParticles2D" -msgstr "Convertir A CPUParticles" +msgstr "Convertir a CPUParticles2D" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp @@ -6992,6 +7014,14 @@ msgstr "Cerrar Docs" msgid "Run" msgstr "Ejecutar" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Buscar" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Step Into" @@ -7045,16 +7075,6 @@ msgstr "" "Los siguientes archivos son nuevos en disco.\n" "¿Qué acción se debería tomar?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Volver a Cargar" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Volver a Guardar" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Depurador" @@ -7150,8 +7170,8 @@ msgstr "Puntos de interrupción" msgid "Go To" msgstr "Ir A" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Cortar" @@ -7374,6 +7394,10 @@ msgid "Yaw" msgstr "Yaw" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "Tamaño" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "Objetos Dibujados" @@ -10065,6 +10089,10 @@ msgid "Projects" msgstr "Proyectos" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "Cargando, esperá, por favor..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "Ultima Modificación" @@ -10435,6 +10463,10 @@ msgstr "AutoLoad" msgid "Plugins" msgstr "Plugins" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "Valores de Importacion Por Defecto" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Preseteo..." @@ -10685,6 +10717,14 @@ msgid "Instance Child Scene" msgstr "Instanciar Escena Hija" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "No se puede pegar el nodo raiz en la misma escena." + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "Pegar Nodo(s)" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Desasignar Script" @@ -10813,6 +10853,10 @@ msgid "Attach Script" msgstr "Adjuntar Script" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "Cortar Nodo(s)" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Quitar Nodo(s)" @@ -11624,36 +11668,31 @@ msgstr "Asignar un recurso MeshLibrary a este GridMap para usar sus meshes." #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Begin Bake" -msgstr "" +msgstr "Iniciar Bake" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Preparing data structures" -msgstr "" +msgstr "Preparando estructuras de datos" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Generate buffers" -msgstr "Generar AABB" +msgstr "Generar buffers" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Direct lighting" -msgstr "Direcciones" +msgstr "Iluminación directa" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Indirect lighting" -msgstr "Indentar a la Der" +msgstr "Iluminación indirecta" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Post processing" -msgstr "Post-Procesado" +msgstr "Post procesado" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Plotting lightmaps" -msgstr "Trazando Luces:" +msgstr "Trazando lightmatps" #: modules/mono/csharp_script.cpp msgid "Class name can't be a reserved keyword" @@ -12173,7 +12212,7 @@ msgstr "Seleccionar dispositivo de la lista" #: platform/android/export/export.cpp msgid "Unable to find the 'apksigner' tool." -msgstr "" +msgstr "No se pudo encontrar la herramienta 'apksigner'." #: platform/android/export/export.cpp msgid "" @@ -12195,18 +12234,13 @@ msgstr "" "exportación." #: platform/android/export/export.cpp -#, fuzzy msgid "A valid Android SDK path is required in Editor Settings." msgstr "" -"Ruta del SDK de Android inválida para la compilación personalizada en " -"Configuración del Editor." +"Se requiere una ruta válida al SDK de Android en la Configuración del Editor." #: platform/android/export/export.cpp -#, fuzzy msgid "Invalid Android SDK path in Editor Settings." -msgstr "" -"Ruta del SDK de Android inválida para la compilación personalizada en " -"Configuración del Editor." +msgstr "Ruta del SDK de Android inválida en la Configuración del Editor." #: platform/android/export/export.cpp msgid "Missing 'platform-tools' directory!" @@ -12214,23 +12248,22 @@ msgstr "¡No se encontró el directorio 'platform-tools'!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK platform-tools' adb command." -msgstr "" +msgstr "No se pudo encontrar el comando adb en las Android SDK platform-tools." #: platform/android/export/export.cpp -#, fuzzy msgid "Please check in the Android SDK directory specified in Editor Settings." msgstr "" -"Ruta del SDK de Android inválida para la compilación personalizada en " +"Por favor, comprueba el directorio del SDK de Android especificado en la " "Configuración del Editor." #: platform/android/export/export.cpp -#, fuzzy msgid "Missing 'build-tools' directory!" -msgstr "¡No se encontró el directorio 'platform-tools'!" +msgstr "¡No se encontró el directorio 'build-tools'!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK build-tools' apksigner command." msgstr "" +"No se pudo encontrar el comando apksigner en las Android SDK build-tools." #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." @@ -12500,6 +12533,18 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Un CollisionPolygon2D vacío no tiene efecto en la colisión." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" +"Polígono inválido. Se necesitan al menos 3 puntos en modo de construcción " +"\"Sólidos\"." + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" +"Polígono inválido. Se necesitan al menos 2 puntos en modo de construcción " +"\"Segmentos\"." + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12713,27 +12758,23 @@ msgstr "ARVROrigin requiere un nodo hijo ARVRCamera." #: scene/3d/baked_lightmap.cpp msgid "Finding meshes and lights" -msgstr "" +msgstr "Encontrar mallas y luces" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing geometry (%d/%d)" -msgstr "Parseando Geometría..." +msgstr "Preparando geometría (%d/%d)" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing environment" -msgstr "Ver Entorno" +msgstr "Preparando entorno" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Generating capture" -msgstr "Generando Lightmaps" +msgstr "Generando capturas" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Saving lightmaps" -msgstr "Generando Lightmaps" +msgstr "Guardando lightmaps" #: scene/3d/baked_lightmap.cpp msgid "Done" @@ -12824,11 +12865,6 @@ msgstr "" "Las GIProbes no están soportadas por el controlador de video GLES2.\n" "Usá un BakedLightmap en su lugar." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera ha sido deprecado y será eliminado en Godot 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13142,6 +13178,8 @@ msgid "" "The sampler port is connected but not used. Consider changing the source to " "'SamplerPort'." msgstr "" +"El puerto de muestreo está conectado, pero no se utiliza. Considerá la " +"posibilidad de cambiar la fuente a \"SamplerPort\"." #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." @@ -13171,6 +13209,10 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice." msgid "Constants cannot be modified." msgstr "Las constantes no pueden modificarse." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "InterpolatedCamera ha sido deprecado y será eliminado en Godot 4.0." + #~ msgid "No" #~ msgstr "No" @@ -14839,9 +14881,6 @@ msgstr "Las constantes no pueden modificarse." #~ msgid "Use Default Light" #~ msgstr "Usar Luz por Defecto" -#~ msgid "Use Default sRGB" -#~ msgstr "Usar sRGB por Defecto" - #~ msgid "Default Light Normal:" #~ msgstr "Normales de Luces por Defecto:" diff --git a/editor/translations/et.po b/editor/translations/et.po index a6576ad312..ba7272db84 100644 --- a/editor/translations/et.po +++ b/editor/translations/et.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2021-01-22 10:21+0000\n" +"PO-Revision-Date: 2021-03-07 06:04+0000\n" "Last-Translator: Kritzmensch <streef.gtx@gmail.com>\n" "Language-Team: Estonian <https://hosted.weblate.org/projects/godot-engine/" "godot/et/>\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.5.1\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -635,7 +635,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopeeri" @@ -697,7 +697,7 @@ msgstr "" #: editor/code_editor.cpp msgid "Replace" -msgstr "" +msgstr "Asenda" #: editor/code_editor.cpp msgid "Replace All" @@ -814,7 +814,7 @@ msgstr "" #: editor/connections_dialog.cpp msgid "Oneshot" -msgstr "" +msgstr "Ainulaadne" #: editor/connections_dialog.cpp msgid "Disconnects the signal after its first emission." @@ -840,7 +840,7 @@ msgstr "Sulge" #: editor/connections_dialog.cpp msgid "Connect" -msgstr "" +msgstr "Ühenda" #: editor/connections_dialog.cpp msgid "Signal:" @@ -860,12 +860,12 @@ msgstr "" #: editor/connections_dialog.cpp msgid "Connect..." -msgstr "" +msgstr "Ühenda..." #: editor/connections_dialog.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Disconnect" -msgstr "" +msgstr "Katkesta ühendus" #: editor/connections_dialog.cpp msgid "Connect a Signal to a Method" @@ -898,7 +898,7 @@ msgstr "" #: editor/connections_dialog.cpp msgid "Edit..." -msgstr "" +msgstr "Muuda..." #: editor/connections_dialog.cpp msgid "Go To Method" @@ -910,7 +910,7 @@ msgstr "" #: editor/create_dialog.cpp editor/project_settings_editor.cpp msgid "Change" -msgstr "" +msgstr "Muuda" #: editor/create_dialog.cpp msgid "Create New %s" @@ -968,20 +968,20 @@ msgstr "" #: editor/dependency_editor.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Dependencies" -msgstr "" +msgstr "Sõltuvused" #: editor/dependency_editor.cpp msgid "Resource" -msgstr "" +msgstr "Ressurss" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings_editor.cpp msgid "Path" -msgstr "" +msgstr "Tee" #: editor/dependency_editor.cpp msgid "Dependencies:" -msgstr "" +msgstr "Sõltuvused:" #: editor/dependency_editor.cpp msgid "Fix Broken" @@ -1213,7 +1213,7 @@ msgstr "" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Success!" -msgstr "" +msgstr "Õnnestus!" #: editor/editor_asset_installer.cpp msgid "Package Contents:" @@ -1221,7 +1221,7 @@ msgstr "" #: editor/editor_asset_installer.cpp editor/editor_node.cpp msgid "Install" -msgstr "" +msgstr "Paigalda" #: editor/editor_asset_installer.cpp msgid "Package Installer" @@ -1285,7 +1285,7 @@ msgstr "Vaigista" #: editor/editor_audio_buses.cpp msgid "Bypass" -msgstr "" +msgstr "Jäta vahele" #: editor/editor_audio_buses.cpp msgid "Bus options" @@ -1306,7 +1306,7 @@ msgstr "" #: editor/editor_audio_buses.cpp msgid "Audio" -msgstr "" +msgstr "Heli" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus" @@ -1830,8 +1830,8 @@ msgid "Open a File or Directory" msgstr "Ava kaust või kataloog" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Salvesta" @@ -2171,7 +2171,7 @@ msgstr "Imporditud ressursse ei saa salvestada." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: scene/gui/dialogs.cpp msgid "OK" -msgstr "" +msgstr "Olgu" #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Error saving resource!" @@ -2427,7 +2427,7 @@ msgstr "Välju" #: editor/editor_node.cpp msgid "Yes" -msgstr "" +msgstr "Jah" #: editor/editor_node.cpp msgid "Exit the editor?" @@ -2472,8 +2472,9 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "" +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "Lisa-skripti ei olnud võimalik laadida teelt: '%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2869,14 +2870,6 @@ msgid "Help" msgstr "Abi" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Otsi" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Veebidokumentatsioonid" @@ -3030,6 +3023,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3039,7 +3048,7 @@ msgstr "Laadimisvead" #: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Select" -msgstr "" +msgstr "Vali" #: editor/editor_node.cpp msgid "Open 2D Editor" @@ -3079,7 +3088,7 @@ msgstr "" #: editor/editor_plugin.cpp msgid "Thumbnail..." -msgstr "" +msgstr "Pisipilt..." #: editor/editor_plugin_settings.cpp msgid "Main Script:" @@ -3136,7 +3145,7 @@ msgstr "" #: editor/editor_profiler.cpp msgid "Inclusive" -msgstr "" +msgstr "Kaasav" #: editor/editor_profiler.cpp msgid "Self" @@ -3160,11 +3169,11 @@ msgstr "" #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" -msgstr "" +msgstr "Sees" #: editor/editor_properties.cpp msgid "Layer" -msgstr "" +msgstr "Kiht" #: editor/editor_properties.cpp msgid "Bit %d, value %d" @@ -3172,11 +3181,11 @@ msgstr "" #: editor/editor_properties.cpp msgid "[Empty]" -msgstr "" +msgstr "[Tühi]" #: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp msgid "Assign..." -msgstr "" +msgstr "Määra..." #: editor/editor_properties.cpp msgid "Invalid RID" @@ -3232,9 +3241,9 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" -msgstr "" +msgstr "Kleebi" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "Convert To %s" @@ -3246,7 +3255,7 @@ msgstr "" #: editor/editor_properties_array_dict.cpp msgid "Size: " -msgstr "" +msgstr "Suurus: " #: editor/editor_properties_array_dict.cpp msgid "Page: " @@ -3330,7 +3339,7 @@ msgstr "" #: editor/export_template_manager.cpp msgid "(Installed)" -msgstr "" +msgstr "(Paigaldatud)" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -3343,11 +3352,11 @@ msgstr "" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "(Puudub)" #: editor/export_template_manager.cpp msgid "(Current)" -msgstr "" +msgstr "(Praegune)" #: editor/export_template_manager.cpp msgid "Retrieving mirrors, please wait..." @@ -3468,7 +3477,7 @@ msgstr "" #: editor/export_template_manager.cpp msgid "Connected" -msgstr "" +msgstr "Ühendatud" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -3529,7 +3538,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Favorites" -msgstr "" +msgstr "Lemmikud" #: editor/filesystem_dock.cpp msgid "Status: Import of file failed. Please fix file and reimport manually." @@ -3913,6 +3922,21 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Valimisrežiim" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Impordi" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Laadi vaikimisi" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4860,7 +4884,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4953,7 +4977,7 @@ msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Import..." -msgstr "" +msgstr "Impordi..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Plugins..." @@ -4964,7 +4988,6 @@ msgid "Sort:" msgstr "Sordi:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategooria:" @@ -6731,6 +6754,14 @@ msgstr "" msgid "Run" msgstr "Käivita" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Otsi" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Trepi sissepoole" @@ -6782,16 +6813,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Siluja" @@ -6884,8 +6905,8 @@ msgstr "Katkepunktid" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7106,6 +7127,10 @@ msgid "Yaw" msgstr "Sagitaal" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "Objekte kuvatud" @@ -9579,12 +9604,17 @@ msgid "" "Please edit the project and set the main scene in the Project Settings under " "the \"Application\" category." msgstr "" +"Projekti ei saa käivitada: peastseeni ei ole määratud.\n" +"Redigeerige project.godot faili ja määrake projekti peastseen \"application" +"\" alajaotuses." #: editor/project_manager.cpp msgid "" "Can't run project: Assets need to be imported.\n" "Please edit the project to trigger the initial import." msgstr "" +"Projekti ei saa käivitada: varad tuleb importida.\n" +"Redigeerige projekti käivitama algset importimise protsessi." #: editor/project_manager.cpp msgid "Are you sure to run %d projects at once?" @@ -9630,6 +9660,10 @@ msgid "Projects" msgstr "Projektid" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -9659,7 +9693,7 @@ msgstr "" #: editor/project_manager.cpp msgid "Can't run project" -msgstr "" +msgstr "Projekti ei saa käivitada" #: editor/project_manager.cpp msgid "" @@ -9990,6 +10024,11 @@ msgstr "" msgid "Plugins" msgstr "Pistikprogrammid" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Laadi vaikimisi" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10233,6 +10272,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Kustuta sõlm(ed)" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10354,6 +10402,11 @@ msgid "Attach Script" msgstr "Manusta skript" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Kustuta sõlm(ed)" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -11311,7 +11364,7 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp msgid "Signals:" -msgstr "" +msgstr "Signaalid:" #: modules/visual_script/visual_script_editor.cpp msgid "Create a new signal." @@ -11929,6 +11982,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12185,11 +12246,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -12387,7 +12443,7 @@ msgstr "" #: scene/gui/dialogs.cpp msgid "Alert!" -msgstr "" +msgstr "Tähelepanu!" #: scene/gui/dialogs.cpp msgid "Please Confirm..." @@ -12421,7 +12477,7 @@ msgstr "" #: scene/gui/tree.cpp msgid "(Other)" -msgstr "" +msgstr "(Muu)" #: scene/main/scene_tree.cpp msgid "" diff --git a/editor/translations/eu.po b/editor/translations/eu.po index cb8cac87ea..95e87167e5 100644 --- a/editor/translations/eu.po +++ b/editor/translations/eu.po @@ -626,7 +626,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1804,8 +1804,8 @@ msgid "Open a File or Directory" msgstr "Ireki fitxategia edo direktorioa" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Gorde" @@ -2440,7 +2440,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2830,14 +2830,6 @@ msgid "Help" msgstr "Laguntza" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Bilatu" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Lineako dokumentuak" @@ -2991,6 +2983,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3193,7 +3201,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3878,6 +3886,20 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Hautatu inportatu nahi dituzun nodoak" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Inportatu azala" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d fitxategi" @@ -4827,7 +4849,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4931,7 +4953,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6699,6 +6720,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Bilatu" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6750,16 +6779,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -6852,8 +6871,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7074,6 +7093,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9598,6 +9621,13 @@ msgid "Projects" msgstr "" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "" +"Fitxategiak arakatzen,\n" +"Itxaron mesedez..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -9960,6 +9990,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Inportatu profila(k)" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10204,6 +10239,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Scripta" @@ -10325,6 +10368,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -11901,6 +11948,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12156,11 +12211,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/fa.po b/editor/translations/fa.po index 39983dc201..1ac27a6fd6 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -19,12 +19,13 @@ # MSKF <walkingdeadstudio@outlook.com>, 2020. # Ahmad Maftoun <CarCedo.Pro@gmail.com>, 2020. # ItzMiad44909858f5774b6d <maidggg@gmail.com>, 2020. +# YASAN <yasandev@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-11-08 10:26+0000\n" -"Last-Translator: MSKF <walkingdeadstudio@outlook.com>\n" +"PO-Revision-Date: 2021-03-16 10:40+0000\n" +"Last-Translator: YASAN <yasandev@gmail.com>\n" "Language-Team: Persian <https://hosted.weblate.org/projects/godot-engine/" "godot/fa/>\n" "Language: fa\n" @@ -32,16 +33,16 @@ 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 4.3.2\n" +"X-Generator: Weblate 4.5.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Invalid type argument to convert(), use TYPE_* constants." -msgstr "نوع ورودی برای ()convert نامعتبر است, ثوابت *_TYPE بکار گیرید ." +msgstr "نوع نامعتبر ورودی برای ()convert، ثوابت *_TYPE را بکار گیرید." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "یک رشته (string) در اندازه 1 (کاراکتر) انتظار می رود." +msgstr "یک رشته بهطول 1 ( یک کاراکتر) مورد انتظار است." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp @@ -658,7 +659,7 @@ msgstr "انتخاب میسرها جهت تکثیر" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "کپی" @@ -1040,11 +1041,10 @@ msgid "Owners Of:" msgstr "مالکانِ:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Remove selected files from the project? (no undo)\n" "You can find the removed files in the system trash to restore them." -msgstr "آیا پروندههای انتخاب شده از طرح حذف شوند؟ (نمیتوان بازیابی کرد)" +msgstr "آیا پروندههای انتخاب شده از طرح حذف شوند؟ (غیر قابل بازیابی)" #: editor/dependency_editor.cpp #, fuzzy @@ -1846,8 +1846,8 @@ msgid "Open a File or Directory" msgstr "یک پرونده یا پوشه را باز کن" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "ذخیره" @@ -2481,8 +2481,9 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "" +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "امکان بارگیری اسکریپت افزونه از مسیر وجود ندارد: '%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2879,14 +2880,6 @@ msgid "Help" msgstr "راهنما" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "جستجو" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3046,6 +3039,23 @@ msgid "Open & Run a Script" msgstr "گشودن و اجرای یک اسکریپت" #: editor/editor_node.cpp +#, fuzzy +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "استخراج پرونده های زیر از بسته بندی انجام نشد:" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "وارث جدید" @@ -3258,7 +3268,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "چسباندن" @@ -3991,6 +4001,21 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "انتخاب حالت" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "وارد کردن" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "بارگیری پیش فرض" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -5003,7 +5028,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5115,7 +5140,6 @@ msgid "Sort:" msgstr "مرتبسازی:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "طبقهبندی:" @@ -6974,6 +6998,14 @@ msgstr "" msgid "Run" msgstr "اجرا" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "جستجو" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7028,16 +7060,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -7138,8 +7160,8 @@ msgstr "حذف کن" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "برش" @@ -7379,6 +7401,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -10059,6 +10085,11 @@ msgid "Projects" msgstr "طرح ها" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "بارگیری" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10437,6 +10468,11 @@ msgstr "AutoLoad" msgid "Plugins" msgstr "افزونهها" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "بارگیری پیش فرض" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10695,6 +10731,15 @@ msgid "Instance Child Scene" msgstr "ارثبری صحنهٔ فرزند" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "مسیر به سمت گره:" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "پیوست کردن اسکریپت" @@ -10826,6 +10871,11 @@ msgid "Attach Script" msgstr "پیوست کردن اسکریپت" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "ساختن گره" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "حذف گره(ها)" @@ -12538,6 +12588,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "یک CollisionPolygon2D خالی جلوه بر برخورد ندارد." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12828,11 +12886,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13350,10 +13403,6 @@ msgstr "ثوابت قابل تغییر نیستند." #~ msgstr "ساختن پوشه" #, fuzzy -#~ msgid "Custom Node" -#~ msgstr "ساختن گره" - -#, fuzzy #~ msgid "Invalid Path" #~ msgstr "مسیر نامعتبر." diff --git a/editor/translations/fi.po b/editor/translations/fi.po index 941f970853..4d690bd29d 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: 2021-01-21 11:57+0000\n" +"PO-Revision-Date: 2021-03-10 22:14+0000\n" "Last-Translator: Tapani Niemi <tapani.niemi@kapsi.fi>\n" "Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/" "godot/fi/>\n" @@ -24,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 4.5-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -648,7 +648,7 @@ msgstr "Valitse kopioitavat raidat" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopioi" @@ -1857,8 +1857,8 @@ msgid "Open a File or Directory" msgstr "Avaa tiedosto tai hakemisto" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Tallenna" @@ -2530,8 +2530,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "Lisäosan '%s' aktivointi epäonnistui, virheellinen asetustiedosto." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "Skriptikenttää ei löytynyt lisäosan tiedostosta: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "Skriptikenttää ei löytynyt lisäosan tiedostosta: '%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2957,14 +2957,6 @@ msgid "Help" msgstr "Ohje" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Hae" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Dokumentaatio" @@ -3129,6 +3121,24 @@ msgid "Open & Run a Script" msgstr "Avaa ja suorita skripti" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"Seuraavat tiedostot ovat uudempia levyllä.\n" +"Mikä toimenpide tulisi suorittaa?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Lataa uudelleen" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Tallenna uudelleen" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Uusi peritty skene" @@ -3340,7 +3350,7 @@ msgstr "Tee yksilölliseksi" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Liitä" @@ -4045,6 +4055,18 @@ msgstr "" msgid "Saving..." msgstr "Tallennetaan..." +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "Valitse tuoja" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "Tuoja:" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "Palauta oletusarvoihin" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d tiedostoa" @@ -5014,8 +5036,8 @@ msgid "Got:" msgstr "Saatiin:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" -msgstr "sha256-hajautusarvon tarkistus epäonnistui" +msgid "Failed SHA-256 hash check" +msgstr "SHA-256 hajautusarvon tarkistus epäonnistui" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5118,7 +5140,6 @@ msgid "Sort:" msgstr "Lajittele:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategoria:" @@ -6946,6 +6967,14 @@ msgstr "Sulje dokumentaatio" msgid "Run" msgstr "Suorita" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Hae" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Siirry sisään" @@ -6999,16 +7028,6 @@ msgstr "" "Seuraavat tiedostot ovat uudempia levyllä.\n" "Mikä toimenpide tulisi suorittaa?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Lataa uudelleen" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Tallenna uudelleen" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Debuggeri" @@ -7103,8 +7122,8 @@ msgstr "Keskeytyskohdat" msgid "Go To" msgstr "Mene" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Leikkaa" @@ -7327,6 +7346,10 @@ msgid "Yaw" msgstr "Käännös (yaw)" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "Koko" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "Objekteja piirretty" @@ -10009,6 +10032,10 @@ msgid "Projects" msgstr "Projektit" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "Ladataan, hetkinen..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "Viimeksi muutettu" @@ -10378,6 +10405,10 @@ msgstr "Automaattilataus" msgid "Plugins" msgstr "Liitännäiset" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "Lataa oletusarvot" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Esiasetus..." @@ -10627,6 +10658,14 @@ msgid "Instance Child Scene" msgstr "Luo aliskenen ilmentymä" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "Juurisolmua ei voida liittää samaan skeneen." + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "Liitä solmu(t)" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Irrota skripti" @@ -10756,6 +10795,10 @@ msgid "Attach Script" msgstr "Liitä skripti" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "Leikkaa solmu(t)" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Poista solmu(t)" @@ -12416,6 +12459,18 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Tyhjällä CollisionPolygon2D solmulla ei ole vaikutusta törmäyksessä." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" +"Virheellinen polygoni. 'Solids' luontitilassa tarvitaan ainakin kolme " +"pistettä." + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" +"Virheellinen polygoni. 'Segments' luontitilassa tarvitaan ainakin kaksi " +"pistettä." + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12734,11 +12789,6 @@ msgstr "" "GIProbe ei ole tuettu GLES2 näyttöajurissa.\n" "Käytä sen sijaan BakedLightmap resurssia." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera on vanhentunut ja poistetaan Godot 4.0 versiossa." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13082,6 +13132,11 @@ msgstr "Varying tyypin voi sijoittaa vain vertex-funktiossa." msgid "Constants cannot be modified." msgstr "Vakioita ei voi muokata." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "" +#~ "InterpolatedCamera on vanhentunut ja poistetaan Godot 4.0 versiossa." + #~ msgid "No" #~ msgstr "Ei" diff --git a/editor/translations/fil.po b/editor/translations/fil.po index 575e1370b3..e9c24cf0f2 100644 --- a/editor/translations/fil.po +++ b/editor/translations/fil.po @@ -634,7 +634,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopya" @@ -1804,8 +1804,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -2440,7 +2440,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2830,14 +2830,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -2992,6 +2984,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3195,7 +3203,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3876,6 +3884,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4824,7 +4844,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4928,7 +4948,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6699,6 +6718,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6750,16 +6777,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -6852,8 +6869,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7074,6 +7091,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9598,6 +9619,10 @@ msgid "Projects" msgstr "" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -9958,6 +9983,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10202,6 +10231,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Burahin ang (mga) Napiling Key" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10322,6 +10360,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -11901,6 +11943,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12156,11 +12206,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/fr.po b/editor/translations/fr.po index befd55180d..7b9d411e6d 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -728,7 +728,7 @@ msgstr "Sélectionner les pistes à copier" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Copier" @@ -1938,8 +1938,8 @@ msgid "Open a File or Directory" msgstr "Ouvrir un fichier ou un répertoire" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Enregistrer" @@ -2619,14 +2619,12 @@ msgstr "Réouvrir la scène fermée" #: editor/editor_node.cpp msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" -"Impossible d'activer le greffon depuis : « %s », l’analyse syntaxique de la " +"Impossible d'activer le plugin depuis : « %s », l’analyse syntaxique de la " "configuration a échoué." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "" -"Impossible de trouver le champ de script pour le plugin dans : « res://" -"addons/%s »." +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "Impossible de trouver le champ de script pour le plugin dans : « %s »." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -3065,14 +3063,6 @@ msgid "Help" msgstr "Aide" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Rechercher" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Documentation en ligne" @@ -3239,6 +3229,24 @@ msgid "Open & Run a Script" msgstr "Ouvrir et exécuter un script" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"Les fichiers suivants sont plus récents sur le disque.\n" +"Quelle action doit être prise ?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Recharger" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Ré-enregistrer" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Nouveau hérité" @@ -3450,7 +3458,7 @@ msgstr "Rendre unique" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Coller" @@ -4159,17 +4167,29 @@ msgstr "" msgid "Saving..." msgstr "Enregistrement…" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "Sélectionnez un importeur" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "Importeur :" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "Réinitialiser" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d fichiers" #: editor/import_dock.cpp msgid "Set as Default for '%s'" -msgstr "Définir comme défaut pour « %s »" +msgstr "Définir comme préréglage pour « %s »" #: editor/import_dock.cpp msgid "Clear Default for '%s'" -msgstr "Effacer le préréglage par défaut pour « %s »" +msgstr "Effacer le préréglage pour « %s »" #: editor/import_dock.cpp msgid "Import As:" @@ -4177,7 +4197,7 @@ msgstr "Importer comme :" #: editor/import_dock.cpp msgid "Preset" -msgstr "Pré-réglage" +msgstr "Préréglage" #: editor/import_dock.cpp msgid "Reimport" @@ -4290,7 +4310,7 @@ msgstr "Modifier un plugin" #: editor/plugin_config_dialog.cpp msgid "Create a Plugin" -msgstr "Créer un Plugin" +msgstr "Créer un plugin" #: editor/plugin_config_dialog.cpp msgid "Plugin Name:" @@ -5134,8 +5154,8 @@ msgid "Got:" msgstr "A :" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" -msgstr "Vérification de brouillage sha256 échouée" +msgid "Failed SHA-256 hash check" +msgstr "Vérification du hachage SHA-256 échouée" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5238,7 +5258,6 @@ msgid "Sort:" msgstr "Trier :" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Catégorie :" @@ -6021,7 +6040,7 @@ msgstr "Modifier la tangente de courbes" #: editor/plugins/curve_editor_plugin.cpp msgid "Load Curve Preset" -msgstr "Charger un pré-réglage de courbe" +msgstr "Charger un préréglage de courbe" #: editor/plugins/curve_editor_plugin.cpp msgid "Add Point" @@ -7080,6 +7099,14 @@ msgstr "Fermer les documentations" msgid "Run" msgstr "Lancer" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Rechercher" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Rentrer" @@ -7133,16 +7160,6 @@ msgstr "" "Les fichiers suivants sont plus récents sur le disque.\n" "Quelle action doit être prise ? :" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Recharger" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Ré-enregistrer" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Débogueur" @@ -7239,8 +7256,8 @@ msgstr "Point d'arrêts" msgid "Go To" msgstr "Atteindre" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Couper" @@ -7463,6 +7480,10 @@ msgid "Yaw" msgstr "Lacet (hauteur)" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "Taille" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "Objets dessinés" @@ -9689,7 +9710,7 @@ msgstr "Exécutable" #: editor/project_export.cpp msgid "Delete preset '%s'?" -msgstr "Supprimer le pré-réglage « %s » ?" +msgstr "Supprimer le préréglage « %s » ?" #: editor/project_export.cpp msgid "" @@ -9727,7 +9748,7 @@ msgstr "Modèles d'exportation manquants ou corrompus pour cette plateforme :" #: editor/project_export.cpp msgid "Presets" -msgstr "Pré-réglages" +msgstr "Préréglages" #: editor/project_export.cpp editor/project_settings_editor.cpp msgid "Add..." @@ -9738,9 +9759,9 @@ msgid "" "If checked, the preset will be available for use in one-click deploy.\n" "Only one preset per platform may be marked as runnable." msgstr "" -"Si cette option est activée, le pré-réglage sera disponible pour le " +"Si cette option est activée, le préréglage sera disponible pour le " "déploiement en un clic.\n" -"Un seul pré-réglage par plateforme peut être marqué comme exécutable." +"Un seul préréglage par plateforme peut être marqué comme exécutable." #: editor/project_export.cpp msgid "Export Path" @@ -10166,6 +10187,10 @@ msgid "Projects" msgstr "Projets" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "Chargement en cours, veuillez patienter..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "Dernière modification" @@ -10536,9 +10561,13 @@ msgstr "AutoLoad" msgid "Plugins" msgstr "Extensions" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "Préréglage des importeurs" + #: editor/property_editor.cpp msgid "Preset..." -msgstr "Pré-réglage…" +msgstr "Préréglage…" #: editor/property_editor.cpp msgid "Zero" @@ -10785,6 +10814,14 @@ msgid "Instance Child Scene" msgstr "Instancier une scène enfant" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "Impossible de copier le nœud racine dans la même scène." + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "Coller le(s) nœud(s)" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Détacher le script" @@ -10911,6 +10948,10 @@ msgid "Attach Script" msgstr "Attacher un script" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "Couper le(s) nœud(s)" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Supprimer le(s) nœud(s)" @@ -12604,6 +12645,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Un CollisionPolygon2D vide n'a pas d'effet sur les collisions." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12928,11 +12977,6 @@ msgstr "" "Les GIProps ne sont pas supporter par le pilote de vidéos GLES2.\n" "A la place utilisez une BakedLightMap." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera a été déprécié et sera supprimé dans Godot 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13136,7 +13180,7 @@ msgid "" msgstr "" "Couleur : #%s\n" "Clic gauche : Définir la couleur\n" -"Clic droit : Supprimer le pré-réglage" +"Clic droit : Supprimer le préréglage" #: scene/gui/color_picker.cpp msgid "Pick a color from the editor window." @@ -13156,7 +13200,7 @@ msgstr "Alterner entre les valeurs hexadécimales ou brutes." #: scene/gui/color_picker.cpp msgid "Add current color as a preset." -msgstr "Ajouter la couleur courante comme pré-réglage." +msgstr "Ajouter la couleur courante comme préréglage." #: scene/gui/container.cpp msgid "" @@ -13286,6 +13330,10 @@ msgstr "Les variations ne peuvent être affectées que dans la fonction vertex." msgid "Constants cannot be modified." msgstr "Les constantes ne peuvent être modifiées." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "InterpolatedCamera a été déprécié et sera supprimé dans Godot 4.0." + #~ msgid "No" #~ msgstr "Non" diff --git a/editor/translations/ga.po b/editor/translations/ga.po index 6036193c24..4e537d9882 100644 --- a/editor/translations/ga.po +++ b/editor/translations/ga.po @@ -627,7 +627,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1798,8 +1798,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -2435,7 +2435,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2825,14 +2825,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -2986,6 +2978,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3188,7 +3196,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3871,6 +3879,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -4821,7 +4841,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4925,7 +4945,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6693,6 +6712,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6744,16 +6771,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -6846,8 +6863,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7068,6 +7085,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9593,6 +9614,10 @@ msgid "Projects" msgstr "" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -9953,6 +9978,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10196,6 +10225,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10316,6 +10353,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -11897,6 +11938,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12152,11 +12201,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/gl.po b/editor/translations/gl.po new file mode 100644 index 0000000000..5559444f0c --- /dev/null +++ b/editor/translations/gl.po @@ -0,0 +1,12861 @@ +# Galician translation of the Godot Engine editor. +# Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. +# Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). +# This file is distributed under the same license as the Godot source code. +# +# Andy Barcia <andybarcia4@gmail.com>, 2021. +# PokeGalaico <abloodyfreaks@gmail.com>, 2021. +msgid "" +msgstr "" +"Project-Id-Version: Godot Engine editor\n" +"PO-Revision-Date: 2021-02-15 10:51+0000\n" +"Last-Translator: Andy Barcia <andybarcia4@gmail.com>\n" +"Language-Team: Galician <https://hosted.weblate.org/projects/godot-engine/" +"godot/gl/>\n" +"Language: gl\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.5-dev\n" + +#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp +#: modules/visual_script/visual_script_builtin_funcs.cpp +msgid "Invalid type argument to convert(), use TYPE_* constants." +msgstr "Tipo de argumento inválido para convert(), utiliza constantes TYPE_*." + +#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp +msgid "Expected a string of length 1 (a character)." +msgstr "Esperábase un string de lonxitude 1 (un carácter)." + +#: 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 hai insuficientes \"bytes\" para descodificar, ou o formato é inválido." + +#: core/math/expression.cpp +msgid "Invalid input %i (not passed) in expression" +msgstr "Entrada inválida %i (non recibida) na expresión" + +#: core/math/expression.cpp +msgid "self can't be used because instance is null (not passed)" +msgstr "Non se pode usar \"self\" porque a instancia é nula (non recibida)" + +#: core/math/expression.cpp +msgid "Invalid operands to operator %s, %s and %s." +msgstr "Operandos inválidos para o operador %s, %s e %s." + +#: core/math/expression.cpp +msgid "Invalid index of type %s for base type %s" +msgstr "Índice de tipo %s inválido para tipo base %s" + +#: core/math/expression.cpp +msgid "Invalid named index '%s' for base type %s" +msgstr "O índice do nome '%s' non é válido para o tipo de base %s" + +#: core/math/expression.cpp +msgid "Invalid arguments to construct '%s'" +msgstr "Argumentos inválidos para construir '%s'" + +#: core/math/expression.cpp +msgid "On call to '%s':" +msgstr "En chamada a '%s':" + +#: core/ustring.cpp +msgid "B" +msgstr "B" + +#: core/ustring.cpp +msgid "KiB" +msgstr "KiB" + +#: core/ustring.cpp +msgid "MiB" +msgstr "MiB" + +#: core/ustring.cpp +msgid "GiB" +msgstr "GiB" + +#: core/ustring.cpp +msgid "TiB" +msgstr "TiB" + +#: core/ustring.cpp +msgid "PiB" +msgstr "PiB" + +#: core/ustring.cpp +msgid "EiB" +msgstr "EiB" + +#: editor/animation_bezier_editor.cpp +msgid "Free" +msgstr "Libre" + +#: editor/animation_bezier_editor.cpp +msgid "Balanced" +msgstr "Balanceado" + +#: editor/animation_bezier_editor.cpp +msgid "Mirror" +msgstr "Espello" + +#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp +msgid "Time:" +msgstr "Tempo:" + +#: editor/animation_bezier_editor.cpp +msgid "Value:" +msgstr "Valor:" + +#: editor/animation_bezier_editor.cpp +msgid "Insert Key Here" +msgstr "Introducir Clave Aquí" + +#: editor/animation_bezier_editor.cpp +msgid "Duplicate Selected Key(s)" +msgstr "Duplicar Clave(s) Seleccionadas(s)" + +#: editor/animation_bezier_editor.cpp +msgid "Delete Selected Key(s)" +msgstr "Eliminar Clave(s) Seleccionada(s)" + +#: editor/animation_bezier_editor.cpp +msgid "Add Bezier Point" +msgstr "Engadir Punto Bezier" + +#: editor/animation_bezier_editor.cpp +msgid "Move Bezier Points" +msgstr "Mover Punto Bezier" + +#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp +msgid "Anim Duplicate Keys" +msgstr "Duplicar Claves de Animación" + +#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp +msgid "Anim Delete Keys" +msgstr "Eliminar Claves de Animación" + +#: editor/animation_track_editor.cpp +msgid "Anim Change Keyframe Time" +msgstr "Cambiar Tempo do Fotograma Clave" + +#: editor/animation_track_editor.cpp +msgid "Anim Change Transition" +msgstr "Cambiar Transición de Animación" + +#: editor/animation_track_editor.cpp +msgid "Anim Change Transform" +msgstr "Cambiar Transformación da Animación" + +#: editor/animation_track_editor.cpp +msgid "Anim Change Keyframe Value" +msgstr "Cambiar Valor do Fotograma Clave da Animación" + +#: editor/animation_track_editor.cpp +msgid "Anim Change Call" +msgstr "Cambiar Chamada da Animación" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Time" +msgstr "Cambiar Tempo de Múltiples Fotogramas Claves de Animación" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transition" +msgstr "Cambiar Múltiples Transicións da Animación" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Transform" +msgstr "Cambiar Múltiples Transformacións da Animación" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Keyframe Value" +msgstr "Cambiar Múltiples Valores do Fotograma Clave da Animación" + +#: editor/animation_track_editor.cpp +msgid "Anim Multi Change Call" +msgstr "Cambiar Múltiples Chamadas da Animación" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Length" +msgstr "Cambiar Lonxitude da Animación" + +#: editor/animation_track_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation Loop" +msgstr "Cambiar Ciclo da Animación" + +#: editor/animation_track_editor.cpp +msgid "Property Track" +msgstr "Pista de Propiedades" + +#: editor/animation_track_editor.cpp +msgid "3D Transform Track" +msgstr "Pista de Transformación 3D" + +#: editor/animation_track_editor.cpp +msgid "Call Method Track" +msgstr "Pista de Chamadas de Métodos" + +#: editor/animation_track_editor.cpp +msgid "Bezier Curve Track" +msgstr "Pista de Curva Bezier" + +#: editor/animation_track_editor.cpp +msgid "Audio Playback Track" +msgstr "Pista de Reprodución de Audio" + +#: editor/animation_track_editor.cpp +msgid "Animation Playback Track" +msgstr "Pista de Reprodución de Animación" + +#: editor/animation_track_editor.cpp +msgid "Animation length (frames)" +msgstr "Lonxitude da Animacion (en fotogramas)" + +#: editor/animation_track_editor.cpp +msgid "Animation length (seconds)" +msgstr "Lonxitude da Animación (en segundos)" + +#: editor/animation_track_editor.cpp +msgid "Add Track" +msgstr "Engadir Pista" + +#: editor/animation_track_editor.cpp +msgid "Animation Looping" +msgstr "Animación en Bucle" + +#: editor/animation_track_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Functions:" +msgstr "Funciones:" + +#: editor/animation_track_editor.cpp +msgid "Audio Clips:" +msgstr "Clips de Audio:" + +#: editor/animation_track_editor.cpp +msgid "Anim Clips:" +msgstr "Clips de Animación:" + +#: editor/animation_track_editor.cpp +msgid "Change Track Path" +msgstr "Cambiar Ruta da Pista" + +#: editor/animation_track_editor.cpp +msgid "Toggle this track on/off." +msgstr "Act./Desact. esta pista." + +#: editor/animation_track_editor.cpp +msgid "Update Mode (How this property is set)" +msgstr "Modo de Actualización (cómo se establece esta propiedade)" + +#: editor/animation_track_editor.cpp +msgid "Interpolation Mode" +msgstr "Modo de Interpolación" + +#: editor/animation_track_editor.cpp +msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" +msgstr "Modo de Bucle Envolvente (interpola o final co comezo do bucle)" + +#: editor/animation_track_editor.cpp +msgid "Remove this track." +msgstr "Eliminar esta pista." + +#: editor/animation_track_editor.cpp +msgid "Time (s): " +msgstr "Tempo (s): " + +#: editor/animation_track_editor.cpp +msgid "Toggle Track Enabled" +msgstr "Act./Desact. Pista" + +#: editor/animation_track_editor.cpp +msgid "Continuous" +msgstr "Continuo" + +#: editor/animation_track_editor.cpp +msgid "Discrete" +msgstr "Discreto" + +#: editor/animation_track_editor.cpp +msgid "Trigger" +msgstr "Detonante (Trigger)" + +#: editor/animation_track_editor.cpp +msgid "Capture" +msgstr "Captura" + +#: editor/animation_track_editor.cpp +msgid "Nearest" +msgstr "Máis Cercano" + +#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp +#: editor/property_editor.cpp +msgid "Linear" +msgstr "Lineal" + +#: editor/animation_track_editor.cpp +msgid "Cubic" +msgstr "Cúbica" + +#: editor/animation_track_editor.cpp +msgid "Clamp Loop Interp" +msgstr "Interpolación de Bucle Recortado" + +#: editor/animation_track_editor.cpp +msgid "Wrap Loop Interp" +msgstr "Interpolación de Bucle Envolvente" + +#: editor/animation_track_editor.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key" +msgstr "Engadir Chave" + +#: editor/animation_track_editor.cpp +msgid "Duplicate Key(s)" +msgstr "Duplicar Chave(s)" + +#: editor/animation_track_editor.cpp +msgid "Delete Key(s)" +msgstr "Eliminar Chave(s)" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Update Mode" +msgstr "Cambiar Modo de Actualización da Animación" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Interpolation Mode" +msgstr "Cambiar Modo de Interpolación da Animación" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Loop Mode" +msgstr "Cambiar Modo de Bucle da Animación" + +#: editor/animation_track_editor.cpp +msgid "Remove Anim Track" +msgstr "Eliminar Pista de Animación" + +#: editor/animation_track_editor.cpp +msgid "Create NEW track for %s and insert key?" +msgstr "Crear nova pista para %s e engadir chave?" + +#: editor/animation_track_editor.cpp +msgid "Create %d NEW tracks and insert keys?" +msgstr "Crear %d novas pistas e engadir chaves?" + +#: editor/animation_track_editor.cpp editor/create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp +#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/mesh_instance_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +#: editor/script_create_dialog.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Create" +msgstr "Crear" + +#: editor/animation_track_editor.cpp +msgid "Anim Insert" +msgstr "Engadir Animación" + +#: editor/animation_track_editor.cpp +msgid "AnimationPlayer can't animate itself, only other players." +msgstr "Un AnimationPlayer non pode animarse a si mesmo, só a outros players." + +#: editor/animation_track_editor.cpp +msgid "Anim Create & Insert" +msgstr "Crear e Engadir Animación" + +#: editor/animation_track_editor.cpp +msgid "Anim Insert Track & Key" +msgstr "Engadir Pista e Chave de Animación" + +#: editor/animation_track_editor.cpp +msgid "Anim Insert Key" +msgstr "Engadir Chave de Animación" + +#: editor/animation_track_editor.cpp +msgid "Change Animation Step" +msgstr "Cambiar Paso de Animación" + +#: editor/animation_track_editor.cpp +msgid "Rearrange Tracks" +msgstr "Reordenar Pistas" + +#: editor/animation_track_editor.cpp +msgid "Transform tracks only apply to Spatial-based nodes." +msgstr "As pistas de transformación só aplícanse a nodos basados en Spatial." + +#: editor/animation_track_editor.cpp +msgid "" +"Audio tracks can only point to nodes of type:\n" +"-AudioStreamPlayer\n" +"-AudioStreamPlayer2D\n" +"-AudioStreamPlayer3D" +msgstr "" +"As pistas de audio só poden apuntar a nodos de tipo:\n" +"-AudioStreamPlayer\n" +"-AudioStreamPlayer2D\n" +"-AudioStreamPlayer3D" + +#: editor/animation_track_editor.cpp +msgid "Animation tracks can only point to AnimationPlayer nodes." +msgstr "As pistas de animación só poden apuntar a nodos AnimationPlayer." + +#: editor/animation_track_editor.cpp +msgid "An animation player can't animate itself, only other players." +msgstr "" +"Un reproductor de animacións non pode animarse a si mesmo, só a outros " +"reproductores." + +#: editor/animation_track_editor.cpp +msgid "Not possible to add a new track without a root" +msgstr "Non é posible engadir unha nova pista sen unha raíz" + +#: editor/animation_track_editor.cpp +msgid "Invalid track for Bezier (no suitable sub-properties)" +msgstr "Pista inválida para Bezier (non hai sub-propiedades axeitadas)" + +#: editor/animation_track_editor.cpp +msgid "Add Bezier Track" +msgstr "Engadir Pista Bezier" + +#: editor/animation_track_editor.cpp +msgid "Track path is invalid, so can't add a key." +msgstr "A ruta á pista é inválida, polo que non se poden engadir chaves." + +#: editor/animation_track_editor.cpp +msgid "Track is not of type Spatial, can't insert key" +msgstr "A pista non é de tipo Spatial, e non se pode engadir chave" + +#: editor/animation_track_editor.cpp +msgid "Add Transform Track Key" +msgstr "Engadir Chave de Pista de Transformación" + +#: editor/animation_track_editor.cpp +msgid "Add Track Key" +msgstr "Engadir Chave de Pista" + +#: editor/animation_track_editor.cpp +msgid "Track path is invalid, so can't add a method key." +msgstr "" +"A ruta á pista é inválida, polo que non se pode engadir unha clave de método." + +#: editor/animation_track_editor.cpp +msgid "Add Method Track Key" +msgstr "Engadir Chave de Pista de Método" + +#: editor/animation_track_editor.cpp +msgid "Method not found in object: " +msgstr "Método non encontrado no obxecto: " + +#: editor/animation_track_editor.cpp +msgid "Anim Move Keys" +msgstr "Mover Claves de Animación" + +#: editor/animation_track_editor.cpp +msgid "Clipboard is empty" +msgstr "O portapapeis está baleiro" + +#: editor/animation_track_editor.cpp +msgid "Paste Tracks" +msgstr "Pegar Pistas" + +#: editor/animation_track_editor.cpp +msgid "Anim Scale Keys" +msgstr "Escalar Chaves de Animación" + +#: editor/animation_track_editor.cpp +msgid "" +"This option does not work for Bezier editing, as it's only a single track." +msgstr "" +"Esta opción non funciona con edición Bezier, xa que é unha única pista." + +#: editor/animation_track_editor.cpp +msgid "" +"This animation belongs to an imported scene, so changes to imported tracks " +"will not be saved.\n" +"\n" +"To enable the ability to add custom tracks, navigate to the scene's import " +"settings and set\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" +"\", then re-import.\n" +"Alternatively, use an import preset that imports animations to separate " +"files." +msgstr "" +"Esta animación pertence a unha escena importada, polo que os cambios nas " +"pistas importadas non quedaran gardados.\n" +"\n" +"Para habilitar a capacidade de engadir pistas personalizadas, vai á " +"configuración de importación da escena e establece\n" +"\"Animación > Almacenamento\" a \"Arquivos\", activa \"Animación > Manter " +"Pistas Personalizadas\", e logo reimportaa.\n" +"Tamén poder usar un preset de importación que importa animacións para " +"separar arquivos." + +#: editor/animation_track_editor.cpp +msgid "Warning: Editing imported animation" +msgstr "Advertencia: Estase editando unha animación importada" + +#: editor/animation_track_editor.cpp +msgid "Select an AnimationPlayer node to create and edit animations." +msgstr "Selecciona un nodo AnimationPlayer para crear e editar animacións." + +#: editor/animation_track_editor.cpp +msgid "Only show tracks from nodes selected in tree." +msgstr "Só mostrar pistas de nodos seleccionados na árbore." + +#: editor/animation_track_editor.cpp +msgid "Group tracks by node or display them as plain list." +msgstr "Agrupar pistas por nodo ou mostralas coma unha simple lista." + +#: editor/animation_track_editor.cpp +msgid "Snap:" +msgstr "Axuste de Cuadrícula:" + +#: editor/animation_track_editor.cpp +msgid "Animation step value." +msgstr "Valor de paso de animación." + +#: editor/animation_track_editor.cpp +msgid "Seconds" +msgstr "Segundos" + +#: editor/animation_track_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "FPS" +msgstr "FPS" + +#: editor/animation_track_editor.cpp editor/editor_properties.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/tile_set_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/property_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit" +msgstr "Editar" + +#: editor/animation_track_editor.cpp +msgid "Animation properties." +msgstr "Propiedades de Animación." + +#: editor/animation_track_editor.cpp +msgid "Copy Tracks" +msgstr "Copiar Pistas" + +#: editor/animation_track_editor.cpp +msgid "Scale Selection" +msgstr "Escalar Selección" + +#: editor/animation_track_editor.cpp +msgid "Scale From Cursor" +msgstr "Escalar desde o Cursor" + +#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp +msgid "Duplicate Selection" +msgstr "Duplicar Selección" + +#: editor/animation_track_editor.cpp +msgid "Duplicate Transposed" +msgstr "Duplicar Transposto" + +#: editor/animation_track_editor.cpp +msgid "Delete Selection" +msgstr "Eliminar Selección" + +#: editor/animation_track_editor.cpp +msgid "Go to Next Step" +msgstr "Ir ao Seguinte Paso" + +#: editor/animation_track_editor.cpp +msgid "Go to Previous Step" +msgstr "Ir ao Anterior Paso" + +#: editor/animation_track_editor.cpp +msgid "Optimize Animation" +msgstr "Optimizar Animación" + +#: editor/animation_track_editor.cpp +msgid "Clean-Up Animation" +msgstr "Limpiar Animación" + +#: editor/animation_track_editor.cpp +msgid "Pick the node that will be animated:" +msgstr "Elixe o nodo que será animado:" + +#: editor/animation_track_editor.cpp +msgid "Use Bezier Curves" +msgstr "Usar Curvas Bezier" + +#: editor/animation_track_editor.cpp +msgid "Anim. Optimizer" +msgstr "Optimizador de Animación" + +#: editor/animation_track_editor.cpp +msgid "Max. Linear Error:" +msgstr "Erro Lineal Máximo:" + +#: editor/animation_track_editor.cpp +msgid "Max. Angular Error:" +msgstr "Erro Angular Máximo:" + +#: editor/animation_track_editor.cpp +msgid "Max Optimizable Angle:" +msgstr "Ángulo Optimizable Máximo:" + +#: editor/animation_track_editor.cpp +msgid "Optimize" +msgstr "Optimizar" + +#: editor/animation_track_editor.cpp +msgid "Remove invalid keys" +msgstr "Eliminar chaves inválidas" + +#: editor/animation_track_editor.cpp +msgid "Remove unresolved and empty tracks" +msgstr "Eliminar pistas baleiras e sen resolver" + +#: editor/animation_track_editor.cpp +msgid "Clean-up all animations" +msgstr "Limpiar tódolas animacións" + +#: editor/animation_track_editor.cpp +msgid "Clean-Up Animation(s) (NO UNDO!)" +msgstr "Limpiar Animación(s) (NON HAI VOLTA ATRÁS!)" + +#: editor/animation_track_editor.cpp +msgid "Clean-Up" +msgstr "Limpiar" + +#: editor/animation_track_editor.cpp +msgid "Scale Ratio:" +msgstr "Relación de Escalado:" + +#: editor/animation_track_editor.cpp +msgid "Select Tracks to Copy" +msgstr "Selecciona as Pistas a Copiar" + +#: editor/animation_track_editor.cpp editor/editor_log.cpp +#: editor/editor_properties.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Copy" +msgstr "Copiar" + +#: editor/animation_track_editor.cpp +msgid "Select All/None" +msgstr "Seleccionar Todas/Ningunha" + +#: editor/animation_track_editor_plugins.cpp +msgid "Add Audio Track Clip" +msgstr "Engadir Clip de Pista de Audio" + +#: editor/animation_track_editor_plugins.cpp +msgid "Change Audio Track Clip Start Offset" +msgstr "Cambiar Inicio do Clip na Pista de Audio" + +#: editor/animation_track_editor_plugins.cpp +msgid "Change Audio Track Clip End Offset" +msgstr "Cambiar Final do Clip na Pista de Audio" + +#: editor/array_property_edit.cpp +msgid "Resize Array" +msgstr "Redimensionar Array" + +#: editor/array_property_edit.cpp +msgid "Change Array Value Type" +msgstr "Cambiar Tipo do Valor do Array" + +#: editor/array_property_edit.cpp +msgid "Change Array Value" +msgstr "Cambiar Valor do Array" + +#: editor/code_editor.cpp +msgid "Go to Line" +msgstr "Ir a Liña" + +#: editor/code_editor.cpp +msgid "Line Number:" +msgstr "Número de Liña:" + +#: editor/code_editor.cpp +msgid "%d replaced." +msgstr "%d substituído." + +#: editor/code_editor.cpp editor/editor_help.cpp +msgid "%d match." +msgstr "%d coincidencia." + +#: editor/code_editor.cpp editor/editor_help.cpp +msgid "%d matches." +msgstr "%d coincidencias." + +#: editor/code_editor.cpp editor/find_in_files.cpp +msgid "Match Case" +msgstr "Coincidir Maiús./Minús." + +#: editor/code_editor.cpp editor/find_in_files.cpp +msgid "Whole Words" +msgstr "Palabras Completas" + +#: editor/code_editor.cpp +msgid "Replace" +msgstr "Substituír" + +#: editor/code_editor.cpp +msgid "Replace All" +msgstr "Substituír Todo" + +#: editor/code_editor.cpp +msgid "Selection Only" +msgstr "Só a Selección" + +#: editor/code_editor.cpp editor/plugins/script_text_editor.cpp +#: editor/plugins/text_editor.cpp +msgid "Standard" +msgstr "Estándar" + +#: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp +msgid "Toggle Scripts Panel" +msgstr "Act./Desact. Panel de Scripts" + +#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/texture_region_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp +msgid "Zoom In" +msgstr "Aumentar Zoom" + +#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/texture_region_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp +msgid "Zoom Out" +msgstr "Diminuír Zoom" + +#: editor/code_editor.cpp +msgid "Reset Zoom" +msgstr "Reiniciar Zoom" + +#: editor/code_editor.cpp +msgid "Warnings" +msgstr "Avisos" + +#: editor/code_editor.cpp +msgid "Line and column numbers." +msgstr "Números de liña e columna." + +#: editor/connections_dialog.cpp +msgid "Method in target node must be specified." +msgstr "Debe especificarse o método no nodo receptor." + +#: editor/connections_dialog.cpp +msgid "Method name must be a valid identifier." +msgstr "O nome do método debe ser un identificador válido." + +#: editor/connections_dialog.cpp +msgid "" +"Target method not found. Specify a valid method or attach a script to the " +"target node." +msgstr "" +"Non se encontrou o método receptor. Especifique un método válido ou engada " +"un script ao nodo receptor." + +#: editor/connections_dialog.cpp +msgid "Connect to Node:" +msgstr "Conectar ao Nodo:" + +#: editor/connections_dialog.cpp +msgid "Connect to Script:" +msgstr "Conectar ao Script:" + +#: editor/connections_dialog.cpp +msgid "From Signal:" +msgstr "Desde a Sinal:" + +#: editor/connections_dialog.cpp +msgid "Scene does not contain any script." +msgstr "A escena non conteñe ningún script." + +#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp +#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp +msgid "Add" +msgstr "Engadir" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/editor_feature_profile.cpp editor/groups_editor.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp +msgid "Remove" +msgstr "Eliminar" + +#: editor/connections_dialog.cpp +msgid "Add Extra Call Argument:" +msgstr "Engadir Argumento Extra á Chamada:" + +#: editor/connections_dialog.cpp +msgid "Extra Call Arguments:" +msgstr "Argumentos Extra da Chamada:" + +#: editor/connections_dialog.cpp +msgid "Receiver Method:" +msgstr "Método Receptor:" + +#: editor/connections_dialog.cpp +msgid "Advanced" +msgstr "Avanzado" + +#: editor/connections_dialog.cpp +msgid "Deferred" +msgstr "Diferido" + +#: editor/connections_dialog.cpp +msgid "" +"Defers the signal, storing it in a queue and only firing it at idle time." +msgstr "" +"Difire a sinal, almacenándoa nunha cola é só executándoa en tempo de " +"inactividade." + +#: editor/connections_dialog.cpp +msgid "Oneshot" +msgstr "Execución Única (Oneshot)" + +#: editor/connections_dialog.cpp +msgid "Disconnects the signal after its first emission." +msgstr "Desconecta a sinal unha vez foi emitida por primeira vez." + +#: editor/connections_dialog.cpp +msgid "Cannot connect signal" +msgstr "No se pode conectar a sinal" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/export_template_manager.cpp editor/groups_editor.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: editor/plugins/version_control_editor_plugin.cpp editor/project_export.cpp +#: editor/project_settings_editor.cpp editor/property_editor.cpp +#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Close" +msgstr "Pechar" + +#: editor/connections_dialog.cpp +msgid "Connect" +msgstr "Conectar" + +#: editor/connections_dialog.cpp +msgid "Signal:" +msgstr "Sinal:" + +#: editor/connections_dialog.cpp +msgid "Connect '%s' to '%s'" +msgstr "Conectar '%s' con '%s'" + +#: editor/connections_dialog.cpp +msgid "Disconnect '%s' from '%s'" +msgstr "Desconectar '%s' de '%s'" + +#: editor/connections_dialog.cpp +msgid "Disconnect all from signal: '%s'" +msgstr "Desconectar todo da sinal: '%s'" + +#: editor/connections_dialog.cpp +msgid "Connect..." +msgstr "Conectar..." + +#: editor/connections_dialog.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Disconnect" +msgstr "Desconectar" + +#: editor/connections_dialog.cpp +msgid "Connect a Signal to a Method" +msgstr "Conectar unha Sinal a un Método" + +#: editor/connections_dialog.cpp +msgid "Edit Connection:" +msgstr "Editar Conexión:" + +#: editor/connections_dialog.cpp +msgid "Are you sure you want to remove all connections from the \"%s\" signal?" +msgstr "Está seguro de que quere eliminar tódalas conexións da sinal '%s'?" + +#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp +msgid "Signals" +msgstr "Sinais" + +#: editor/connections_dialog.cpp +msgid "Filter signals" +msgstr "Filtrar sinais" + +#: editor/connections_dialog.cpp +msgid "Are you sure you want to remove all connections from this signal?" +msgstr "Está seguro de que quere eliminar tódalas conexións desta sinal?" + +#: editor/connections_dialog.cpp +msgid "Disconnect All" +msgstr "Desconectar Todas" + +#: editor/connections_dialog.cpp +msgid "Edit..." +msgstr "Editar..." + +#: editor/connections_dialog.cpp +msgid "Go To Method" +msgstr "Ir ao Método" + +#: editor/create_dialog.cpp +msgid "Change %s Type" +msgstr "Cambiar o Tipo de %s" + +#: editor/create_dialog.cpp editor/project_settings_editor.cpp +msgid "Change" +msgstr "Cambiar" + +#: editor/create_dialog.cpp +msgid "Create New %s" +msgstr "Crear Novo %s" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp +msgid "Favorites:" +msgstr "Favoritos:" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +msgid "Recent:" +msgstr "Recente:" + +#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp +#: editor/property_selector.cpp editor/quick_open.cpp editor/rename_dialog.cpp +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Search:" +msgstr "Buscar:" + +#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp +#: editor/property_selector.cpp editor/quick_open.cpp +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Matches:" +msgstr "Coincidencias:" + +#: editor/create_dialog.cpp editor/editor_plugin_settings.cpp +#: editor/plugin_config_dialog.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/property_selector.cpp +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Description:" +msgstr "Descrición:" + +#: editor/dependency_editor.cpp +msgid "Search Replacement For:" +msgstr "Buscar Substitución Para:" + +#: editor/dependency_editor.cpp +msgid "Dependencies For:" +msgstr "Dependencias De:" + +#: editor/dependency_editor.cpp +msgid "" +"Scene '%s' is currently being edited.\n" +"Changes will only take effect when reloaded." +msgstr "" +"A escena '%s' agora mesmo está sendo editada.\n" +"Os cambios só terán efecto cando sexa recargada." + +#: editor/dependency_editor.cpp +msgid "" +"Resource '%s' is in use.\n" +"Changes will only take effect when reloaded." +msgstr "" +"O recurso '%s' agora mesmo está sendo usado.\n" +"Os cambios só terán efecto cando sexa recargado." + +#: editor/dependency_editor.cpp +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Dependencies" +msgstr "Dependencias" + +#: editor/dependency_editor.cpp +msgid "Resource" +msgstr "Recurso" + +#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp +#: editor/project_manager.cpp editor/project_settings_editor.cpp +msgid "Path" +msgstr "Ruta" + +#: editor/dependency_editor.cpp +msgid "Dependencies:" +msgstr "Dependencias:" + +#: editor/dependency_editor.cpp +msgid "Fix Broken" +msgstr "Corrixir Erros" + +#: editor/dependency_editor.cpp +msgid "Dependency Editor" +msgstr "Editor de Dependencias" + +#: editor/dependency_editor.cpp +msgid "Search Replacement Resource:" +msgstr "Buscar Recurso de Substitución:" + +#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp +#: editor/editor_help_search.cpp editor/editor_node.cpp +#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp +#: editor/property_selector.cpp editor/quick_open.cpp +#: editor/script_create_dialog.cpp +#: modules/visual_script/visual_script_property_selector.cpp +#: scene/gui/file_dialog.cpp +msgid "Open" +msgstr "Abrir" + +#: editor/dependency_editor.cpp +msgid "Owners Of:" +msgstr "Dono De:" + +#: editor/dependency_editor.cpp +msgid "" +"Remove selected files from the project? (no undo)\n" +"You can find the removed files in the system trash to restore them." +msgstr "" +"Eliminar do proxecto os arquivos seleccionados? (non se pode reverter)\n" +"Podes encontrar os arquivos eliminados na papeleira de reciclaxe do sistema " +"para restaurarlos." + +#: editor/dependency_editor.cpp +msgid "" +"The files being removed are required by other resources in order for them to " +"work.\n" +"Remove them anyway? (no undo)\n" +"You can find the removed files in the system trash to restore them." +msgstr "" +"Os arquivos sendo eliminados están requeridos por outros recursos para poder " +"funcionar.\n" +"Eliminalos de todas formas? (non se pode reverter)\n" +"Podes encontrar os arquivos eliminados na papeleira de reciclaxe do sistema " +"para restaurarlos." + +#: editor/dependency_editor.cpp +msgid "Cannot remove:" +msgstr "Non se pode eliminar:" + +#: editor/dependency_editor.cpp +msgid "Error loading:" +msgstr "Erro cargando:" + +#: editor/dependency_editor.cpp +msgid "Load failed due to missing dependencies:" +msgstr "Fallou a carga debido a dependencias ausentes:" + +#: editor/dependency_editor.cpp editor/editor_node.cpp +msgid "Open Anyway" +msgstr "Abrir de Todos Modos" + +#: editor/dependency_editor.cpp +msgid "Which action should be taken?" +msgstr "Que acción debería de tomarse?" + +#: editor/dependency_editor.cpp +msgid "Fix Dependencies" +msgstr "Corrixir Dependencias" + +#: editor/dependency_editor.cpp +msgid "Errors loading!" +msgstr "Erros na carga!" + +#: editor/dependency_editor.cpp +msgid "Permanently delete %d item(s)? (No undo!)" +msgstr "Eliminar permanentemente %d obxectos? (Non se pode reverter!)" + +#: editor/dependency_editor.cpp +msgid "Show Dependencies" +msgstr "Amosar Dependencias" + +#: editor/dependency_editor.cpp +msgid "Orphan Resource Explorer" +msgstr "Explorador de Recursos Orfos" + +#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp +#: editor/editor_file_dialog.cpp editor/editor_node.cpp +#: editor/plugins/item_list_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp +#: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp +msgid "Delete" +msgstr "Eliminar" + +#: editor/dependency_editor.cpp +msgid "Owns" +msgstr "É Dono de" + +#: editor/dependency_editor.cpp +msgid "Resources Without Explicit Ownership:" +msgstr "Recursos Sen Dono Explícito:" + +#: editor/dictionary_property_edit.cpp +msgid "Change Dictionary Key" +msgstr "Cambiar Chave do Dicionario" + +#: editor/dictionary_property_edit.cpp +msgid "Change Dictionary Value" +msgstr "Cambiar Valor do Dicionario" + +#: editor/editor_about.cpp +msgid "Thanks from the Godot community!" +msgstr "Moitas grazas de parte da comunidade de Godot!" + +#: editor/editor_about.cpp +msgid "Godot Engine contributors" +msgstr "Colaboradores de Godot Engine" + +#: editor/editor_about.cpp +msgid "Project Founders" +msgstr "Fundadores do Proxecto" + +#: editor/editor_about.cpp +msgid "Lead Developer" +msgstr "Desenvolvedor Líder" + +#. TRANSLATORS: This refers to a job title. +#. The trailing space is used to distinguish with the project list application, +#. you do not have to keep it in your translation. +#: editor/editor_about.cpp +msgid "Project Manager " +msgstr "Xestor do Proxecto " + +#: editor/editor_about.cpp +msgid "Developers" +msgstr "Desenvolvedores" + +#: editor/editor_about.cpp +msgid "Authors" +msgstr "Autores" + +#: editor/editor_about.cpp +msgid "Platinum Sponsors" +msgstr "Patrocinadores Platino" + +#: editor/editor_about.cpp +msgid "Gold Sponsors" +msgstr "Patrocinadores Ouro" + +#: editor/editor_about.cpp +msgid "Silver Sponsors" +msgstr "Patrocinadores Prata" + +#: editor/editor_about.cpp +msgid "Bronze Sponsors" +msgstr "Patrocinadores Bronce" + +#: editor/editor_about.cpp +msgid "Mini Sponsors" +msgstr "Patrocinadores Mini" + +#: editor/editor_about.cpp +msgid "Gold Donors" +msgstr "Doadores Ouro" + +#: editor/editor_about.cpp +msgid "Silver Donors" +msgstr "Doadores Prata" + +#: editor/editor_about.cpp +msgid "Bronze Donors" +msgstr "Doadores Bronce" + +#: editor/editor_about.cpp +msgid "Donors" +msgstr "Doadores" + +#: editor/editor_about.cpp +msgid "License" +msgstr "Licenza" + +#: editor/editor_about.cpp +msgid "Third-party Licenses" +msgstr "Licenzas de Terceiros" + +#: editor/editor_about.cpp +msgid "" +"Godot Engine relies on a number of third-party free and open source " +"libraries, all compatible with the terms of its MIT license. The following " +"is an exhaustive list of all such third-party components with their " +"respective copyright statements and license terms." +msgstr "" +"Godot Engine depende dun número de bibliotecas de terceiros, gratis e open " +"source; todas compatibles cos termos da licenza MIT. A seguinte e unha lista " +"exhaustiva dos devanditos compoñentes de terceiros, coas suas respectivas " +"declaracións de copyright e termos de licenza." + +#: editor/editor_about.cpp +msgid "All Components" +msgstr "Todos os Compoñentes" + +#: editor/editor_about.cpp +msgid "Components" +msgstr "Compoñentes" + +#: editor/editor_about.cpp +msgid "Licenses" +msgstr "Licenzas" + +#: editor/editor_asset_installer.cpp editor/project_manager.cpp +msgid "Error opening package file, not in ZIP format." +msgstr "Erro ao abrir o arquivo comprimido, non está en formato ZIP." + +#: editor/editor_asset_installer.cpp +msgid "%s (Already Exists)" +msgstr "%s (Xa Existe)" + +#: editor/editor_asset_installer.cpp +msgid "Uncompressing Assets" +msgstr "Descomprimindo Assets" + +#: editor/editor_asset_installer.cpp editor/project_manager.cpp +msgid "The following files failed extraction from package:" +msgstr "Os seguintes arquivos non se poideron extraer do paquete:" + +#: editor/editor_asset_installer.cpp +msgid "And %s more files." +msgstr "E %s arquivos máis." + +#: editor/editor_asset_installer.cpp editor/project_manager.cpp +msgid "Package installed successfully!" +msgstr "Paquete instalado correctamente!" + +#: editor/editor_asset_installer.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Success!" +msgstr "Éxito!" + +#: editor/editor_asset_installer.cpp +msgid "Package Contents:" +msgstr "Contenido do Paquete:" + +#: editor/editor_asset_installer.cpp editor/editor_node.cpp +msgid "Install" +msgstr "Instalar" + +#: editor/editor_asset_installer.cpp +msgid "Package Installer" +msgstr "Instalador de Paquetes" + +#: editor/editor_audio_buses.cpp +msgid "Speakers" +msgstr "Altofalantes" + +#: editor/editor_audio_buses.cpp +msgid "Add Effect" +msgstr "Engadir Efecto" + +#: editor/editor_audio_buses.cpp +msgid "Rename Audio Bus" +msgstr "Renomear Bus de Son" + +#: editor/editor_audio_buses.cpp +msgid "Change Audio Bus Volume" +msgstr "Cambiar Volume do Bus de Son" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Solo" +msgstr "Act./Desact. Solo do Bus de Son" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Mute" +msgstr "Act./Desact. Silencio do Bus de Son" + +#: editor/editor_audio_buses.cpp +msgid "Toggle Audio Bus Bypass Effects" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Select Audio Bus Send" +msgstr "Seleccionar Envío do Bus de Audio" + +#: editor/editor_audio_buses.cpp +msgid "Add Audio Bus Effect" +msgstr "Engadir Efecto ao Bus de Son" + +#: editor/editor_audio_buses.cpp +msgid "Move Bus Effect" +msgstr "Mover Efecto do Bus de Son" + +#: editor/editor_audio_buses.cpp +msgid "Delete Bus Effect" +msgstr "Eliminar Efecto do Bus de Son" + +#: editor/editor_audio_buses.cpp +msgid "Drag & drop to rearrange." +msgstr "Arrastrar e soltar para reordenar." + +#: editor/editor_audio_buses.cpp +msgid "Solo" +msgstr "Solo" + +#: editor/editor_audio_buses.cpp +msgid "Mute" +msgstr "Silenciar" + +#: editor/editor_audio_buses.cpp +msgid "Bypass" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Bus options" +msgstr "Opcións de Bus" + +#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp +#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Duplicate" +msgstr "Duplicar" + +#: editor/editor_audio_buses.cpp +msgid "Reset Volume" +msgstr "Restablecer Volume" + +#: editor/editor_audio_buses.cpp +msgid "Delete Effect" +msgstr "Eliminar Efecto" + +#: editor/editor_audio_buses.cpp +msgid "Audio" +msgstr "Son" + +#: editor/editor_audio_buses.cpp +msgid "Add Audio Bus" +msgstr "Engadir Bus de Son" + +#: editor/editor_audio_buses.cpp +msgid "Master bus can't be deleted!" +msgstr "Non se pode eliminar o Bus mestre!" + +#: editor/editor_audio_buses.cpp +msgid "Delete Audio Bus" +msgstr "Eliminar Bus de Son" + +#: editor/editor_audio_buses.cpp +msgid "Duplicate Audio Bus" +msgstr "Duplicar Bus de Son" + +#: editor/editor_audio_buses.cpp +msgid "Reset Bus Volume" +msgstr "Restablecer Volume do Bus" + +#: editor/editor_audio_buses.cpp +msgid "Move Audio Bus" +msgstr "Mover Bus de Son" + +#: editor/editor_audio_buses.cpp +msgid "Save Audio Bus Layout As..." +msgstr "Gardar Disposición do Bus de Son Como..." + +#: editor/editor_audio_buses.cpp +msgid "Location for New Layout..." +msgstr "Localización para a Nova Disposición..." + +#: editor/editor_audio_buses.cpp +msgid "Open Audio Bus Layout" +msgstr "Abrir Disposición do Bus de Son" + +#: editor/editor_audio_buses.cpp +msgid "There is no '%s' file." +msgstr "Non hai ningún arquivo '%s'." + +#: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp +msgid "Layout" +msgstr "Disposición" + +#: editor/editor_audio_buses.cpp +msgid "Invalid file, not an audio bus layout." +msgstr "Arquivo invalido; non é unha disposición dun Bus de son." + +#: editor/editor_audio_buses.cpp +msgid "Error saving file: %s" +msgstr "Erro gardando o arquivo: %s" + +#: editor/editor_audio_buses.cpp +msgid "Add Bus" +msgstr "Engadir Bus" + +#: editor/editor_audio_buses.cpp +msgid "Add a new Audio Bus to this layout." +msgstr "Engadir un novo Bus de Son a esta disposición." + +#: editor/editor_audio_buses.cpp editor/editor_properties.cpp +#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Load" +msgstr "Cargar" + +#: editor/editor_audio_buses.cpp +msgid "Load an existing Bus Layout." +msgstr "Cargar unha disposición de Bus xa existente." + +#: editor/editor_audio_buses.cpp +msgid "Save As" +msgstr "Gardar Como" + +#: editor/editor_audio_buses.cpp +msgid "Save this Bus Layout to a file." +msgstr "Gardar esta disposición de Bus a un arquivo." + +#: editor/editor_audio_buses.cpp editor/import_dock.cpp +msgid "Load Default" +msgstr "Cargar Valores por Defecto" + +#: editor/editor_audio_buses.cpp +msgid "Load the default Bus Layout." +msgstr "Cargar a disposición de Bus por defecto." + +#: editor/editor_audio_buses.cpp +msgid "Create a new Bus Layout." +msgstr "Crear unha nova Disposición de Bus." + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name." +msgstr "Nome inválido." + +#: editor/editor_autoload_settings.cpp +msgid "Valid characters:" +msgstr "Caracteres válidos:" + +#: editor/editor_autoload_settings.cpp +msgid "Must not collide with an existing engine class name." +msgstr "Non debe coincidir co nome dunha clase xa existente no engine." + +#: editor/editor_autoload_settings.cpp +msgid "Must not collide with an existing built-in type name." +msgstr "Non debe coincidir co nome dun tipo xa existente no engine." + +#: editor/editor_autoload_settings.cpp +msgid "Must not collide with an existing global constant name." +msgstr "Non debe coincidir co nome dunha constante global xa existente." + +#: editor/editor_autoload_settings.cpp +msgid "Keyword cannot be used as an autoload name." +msgstr "Unha palabra clave non pode usarse como nome dun AutoCargador." + +#: editor/editor_autoload_settings.cpp +msgid "Autoload '%s' already exists!" +msgstr "Xa existe un AutoCargador nomeado '%s'!" + +#: editor/editor_autoload_settings.cpp +msgid "Rename Autoload" +msgstr "Renomear AutoCargador" + +#: editor/editor_autoload_settings.cpp +msgid "Toggle AutoLoad Globals" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Move Autoload" +msgstr "Mover AutoCargador" + +#: editor/editor_autoload_settings.cpp +msgid "Remove Autoload" +msgstr "Eliminar AutoCargador" + +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp +msgid "Enable" +msgstr "Activar" + +#: editor/editor_autoload_settings.cpp +msgid "Rearrange Autoloads" +msgstr "Reordenar AutoCargadores" + +#: editor/editor_autoload_settings.cpp +msgid "Can't add autoload:" +msgstr "Non se puido engadir AutoCargador:" + +#: editor/editor_autoload_settings.cpp +msgid "Add AutoLoad" +msgstr "Engadir AutoCargador" + +#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp +#: editor/editor_plugin_settings.cpp +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +msgid "Path:" +msgstr "Ruta:" + +#: editor/editor_autoload_settings.cpp +msgid "Node Name:" +msgstr "Nome do Nodo:" + +#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp +#: editor/editor_profiler.cpp editor/project_manager.cpp +#: editor/settings_config_dialog.cpp +msgid "Name" +msgstr "Nome" + +#: editor/editor_autoload_settings.cpp +msgid "Singleton" +msgstr "" + +#: editor/editor_data.cpp editor/inspector_dock.cpp +msgid "Paste Params" +msgstr "Pegar Parámetros" + +#: editor/editor_data.cpp +msgid "Updating Scene" +msgstr "Actualizando Escena" + +#: editor/editor_data.cpp +msgid "Storing local changes..." +msgstr "Gardando cambios locales..." + +#: editor/editor_data.cpp +msgid "Updating scene..." +msgstr "Actualizando escena..." + +#: editor/editor_data.cpp editor/editor_properties.cpp +msgid "[empty]" +msgstr "[baleiro]" + +#: editor/editor_data.cpp +msgid "[unsaved]" +msgstr "[non gardado]" + +#: editor/editor_dir_dialog.cpp +msgid "Please select a base directory first." +msgstr "Por favor, seleccione primeiro un directorio base." + +#: editor/editor_dir_dialog.cpp +msgid "Choose a Directory" +msgstr "Elixir un Directorio" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp editor/project_manager.cpp +#: scene/gui/file_dialog.cpp +msgid "Create Folder" +msgstr "Crear Cartafol" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp +#: modules/visual_script/visual_script_editor.cpp scene/gui/file_dialog.cpp +msgid "Name:" +msgstr "Nome:" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp +msgid "Could not create folder." +msgstr "Non se puido crear cartafol." + +#: editor/editor_dir_dialog.cpp +msgid "Choose" +msgstr "Elixir" + +#: editor/editor_export.cpp +msgid "Storing File:" +msgstr "Gardando Arquivo:" + +#: editor/editor_export.cpp +msgid "No export template found at the expected path:" +msgstr "Non se encontrou ningún modelo de exportación na ruta esperada:" + +#: editor/editor_export.cpp +msgid "Packing" +msgstr "Empaquetando" + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'ETC' texture compression for GLES2. Enable 'Import " +"Etc' in Project Settings." +msgstr "" +"A plataforma actual require compresión de texturas 'ETC' para GLES2. Active " +"'Importar Etc' na 'Configuración do Proxecto'." + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'ETC2' texture compression for GLES3. Enable " +"'Import Etc 2' in Project Settings." +msgstr "" +"A plataforma actual require compresión de texturas 'ETC2' para GLES3. Active " +"'Importar Etc 2' na 'Configuración do Proxecto'." + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'ETC' texture compression for the driver fallback " +"to GLES2.\n" +"Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback " +"Enabled'." +msgstr "" +"A plataforma actual require unha compresión de texturas 'ETC' para o " +"controlador de respaldo a GLES2.\n" +"Active 'Importar Etc' na 'Configuración do Proxecto' ou desactive " +"'Controlador de Respaldo Activado'." + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'PVRTC' texture compression for GLES2. Enable " +"'Import Pvrtc' in Project Settings." +msgstr "" +"A plataforma actual require compresión de texturas 'PVRTC' para GLES2. " +"Active 'Importar Pvrtc' na 'Configuración do Proxecto'." + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'ETC2' or 'PVRTC' texture compression for GLES3. " +"Enable 'Import Etc 2' or 'Import Pvrtc' in Project Settings." +msgstr "" +"A plataforma actual require compresión de texturas 'ETC2' ou 'PVRTC' para " +"GLES3. Active 'Importar Etc 2' ou 'Importar Pvrtc' na 'Configuración do " +"Proxecto'." + +#: editor/editor_export.cpp +msgid "" +"Target platform requires 'PVRTC' texture compression for the driver fallback " +"to GLES2.\n" +"Enable 'Import Pvrtc' in Project Settings, or disable 'Driver Fallback " +"Enabled'." +msgstr "" +"A plataforma actual require unha compresión de texturas 'PVRTC' para o " +"controlador de respaldo a GLES2.\n" +"Active 'Importar Pvrtc' na 'Configuración do Proxecto' ou desactive " +"'Controlador de Respaldo Activado'." + +#: editor/editor_export.cpp platform/android/export/export.cpp +#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp +#: platform/osx/export/export.cpp platform/uwp/export/export.cpp +msgid "Custom debug template not found." +msgstr "Non se encontrou un modelo de depuración personalizado." + +#: editor/editor_export.cpp platform/android/export/export.cpp +#: platform/iphone/export/export.cpp platform/javascript/export/export.cpp +#: platform/osx/export/export.cpp platform/uwp/export/export.cpp +msgid "Custom release template not found." +msgstr "" + +#: editor/editor_export.cpp platform/javascript/export/export.cpp +msgid "Template file not found:" +msgstr "Non se encontrou o arquivo do modelo:" + +#: editor/editor_export.cpp +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "Na exportación de 32 bits o PCK integrado non pode ser maior de 4 GiB." + +#: editor/editor_feature_profile.cpp +msgid "3D Editor" +msgstr "Editor 3D" + +#: editor/editor_feature_profile.cpp +msgid "Script Editor" +msgstr "Editor de Scripts" + +#: editor/editor_feature_profile.cpp +msgid "Asset Library" +msgstr "Biblioteca de Assets" + +#: editor/editor_feature_profile.cpp +msgid "Scene Tree Editing" +msgstr "Edición de Árbore de Escenas" + +#: editor/editor_feature_profile.cpp +msgid "Node Dock" +msgstr "Panel de Nodos" + +#: editor/editor_feature_profile.cpp +msgid "FileSystem Dock" +msgstr "Panel de Sistema de Arquivos" + +#: editor/editor_feature_profile.cpp +msgid "Import Dock" +msgstr "Panel de Importación" + +#: editor/editor_feature_profile.cpp +msgid "Erase profile '%s'? (no undo)" +msgstr "Eliminar perfil '%s'? (non se pode deshacer)" + +#: editor/editor_feature_profile.cpp +msgid "Profile must be a valid filename and must not contain '.'" +msgstr "Un perfil debe ter un nome de arquivo válido, e non pode conter '.'" + +#: editor/editor_feature_profile.cpp +msgid "Profile with this name already exists." +msgstr "Un perfil con este nome xa existe." + +#: editor/editor_feature_profile.cpp +msgid "(Editor Disabled, Properties Disabled)" +msgstr "(Editor Desactivado, Propiedades Desactivadas)" + +#: editor/editor_feature_profile.cpp +msgid "(Properties Disabled)" +msgstr "(Propiedades Desactivadas)" + +#: editor/editor_feature_profile.cpp +msgid "(Editor Disabled)" +msgstr "(Editor Desactivado)" + +#: editor/editor_feature_profile.cpp +msgid "Class Options:" +msgstr "Opcións de Clase:" + +#: editor/editor_feature_profile.cpp +msgid "Enable Contextual Editor" +msgstr "Activar o Editor Contextual" + +#: editor/editor_feature_profile.cpp +msgid "Enabled Properties:" +msgstr "Propiedades Activadas:" + +#: editor/editor_feature_profile.cpp +msgid "Enabled Features:" +msgstr "Características Activadas:" + +#: editor/editor_feature_profile.cpp +msgid "Enabled Classes:" +msgstr "Clases Activadas:" + +#: editor/editor_feature_profile.cpp +msgid "File '%s' format is invalid, import aborted." +msgstr "O formato '%s' do arquivo non é válido, a importación foi cancelada." + +#: editor/editor_feature_profile.cpp +msgid "" +"Profile '%s' already exists. Remove it first before importing, import " +"aborted." +msgstr "" +"O perfil '%s' xa existe. Elimínao antes de importar; importación abortada." + +#: editor/editor_feature_profile.cpp +msgid "Error saving profile to path: '%s'." +msgstr "Erro gardando o perfil á ruta: '%s'." + +#: editor/editor_feature_profile.cpp +msgid "Unset" +msgstr "" + +#: editor/editor_feature_profile.cpp +msgid "Current Profile:" +msgstr "Perfil Actual:" + +#: editor/editor_feature_profile.cpp +msgid "Make Current" +msgstr "Convertelo no Actual" + +#: editor/editor_feature_profile.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/version_control_editor_plugin.cpp +msgid "New" +msgstr "Novo" + +#: editor/editor_feature_profile.cpp editor/editor_node.cpp +#: editor/project_manager.cpp +msgid "Import" +msgstr "Importación" + +#: editor/editor_feature_profile.cpp editor/project_export.cpp +msgid "Export" +msgstr "Exportación" + +#: editor/editor_feature_profile.cpp +msgid "Available Profiles:" +msgstr "Perfils Dispoñibles:" + +#: editor/editor_feature_profile.cpp +msgid "Class Options" +msgstr "Opcións de Clase" + +#: editor/editor_feature_profile.cpp +msgid "New profile name:" +msgstr "Nome do novo perfil:" + +#: editor/editor_feature_profile.cpp +msgid "Erase Profile" +msgstr "Eliminar Perfil" + +#: editor/editor_feature_profile.cpp +msgid "Godot Feature Profile" +msgstr "Perfil de Características de Godot" + +#: editor/editor_feature_profile.cpp +msgid "Import Profile(s)" +msgstr "Importar Perfil(s)" + +#: editor/editor_feature_profile.cpp +msgid "Export Profile" +msgstr "Exportar Perfil" + +#: editor/editor_feature_profile.cpp +msgid "Manage Editor Feature Profiles" +msgstr "Administrar Perfils de Características de Godot" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Select Current Folder" +msgstr "Seleccionar Cartafol Actual" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "File Exists, Overwrite?" +msgstr "O arquivo xa existe ¿Queres sobreescribilo?" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Select This Folder" +msgstr "Seleccionar Este Cartafol" + +#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp +msgid "Copy Path" +msgstr "Copiar Ruta" + +#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp +msgid "Open in File Manager" +msgstr "Abrir no Explorador de Arquivos" + +#: editor/editor_file_dialog.cpp editor/editor_node.cpp +#: editor/filesystem_dock.cpp editor/project_manager.cpp +msgid "Show in File Manager" +msgstr "Amosar no Explorador de Arquivos" + +#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp +msgid "New Folder..." +msgstr "Novo Cartafol..." + +#: editor/editor_file_dialog.cpp editor/find_in_files.cpp +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Refresh" +msgstr "Actualizar" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Recognized" +msgstr "Todos Recoñecidos" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Files (*)" +msgstr "Todos os Arquivos (*)" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a File" +msgstr "Abrir un Arquivo" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open File(s)" +msgstr "Abrir Arquivo(s)" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a Directory" +msgstr "Abrir un Directorio" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Open a File or Directory" +msgstr "Abrir un Arquivo ou Directorio" + +#: editor/editor_file_dialog.cpp editor/editor_node.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp +msgid "Save" +msgstr "Gardar" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Save a File" +msgstr "Gardar un Arquivo" + +#: editor/editor_file_dialog.cpp +msgid "Go Back" +msgstr "Retroceder" + +#: editor/editor_file_dialog.cpp +msgid "Go Forward" +msgstr "Avanzar" + +#: editor/editor_file_dialog.cpp +msgid "Go Up" +msgstr "Subir" + +#: editor/editor_file_dialog.cpp +#, fuzzy +msgid "Toggle Hidden Files" +msgstr "Amosar/Ocultar Arquivos Ocultos" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Favorite" +msgstr "Act./Desact. Favorito" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Mode" +msgstr "Act./Desact. Modo" + +#: editor/editor_file_dialog.cpp +msgid "Focus Path" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Up" +msgstr "Subir Favorito" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Down" +msgstr "Baixar Favorito" + +#: editor/editor_file_dialog.cpp +msgid "Go to previous folder." +msgstr "Ir ao cartafol anterior." + +#: editor/editor_file_dialog.cpp +msgid "Go to next folder." +msgstr "Ir ao cartafol seguinte." + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Go to parent folder." +msgstr "Ir ao cartafol padre." + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Refresh files." +msgstr "Actualizar Arquivos." + +#: editor/editor_file_dialog.cpp +msgid "(Un)favorite current folder." +msgstr "Quitar cartafol actual de favoritos." + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Toggle the visibility of hidden files." +msgstr "Amosar/Ocultar arquivos ocultos." + +#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp +msgid "View items as a grid of thumbnails." +msgstr "Ver elementos coma unha cuadrícula de miniaturas." + +#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp +msgid "View items as a list." +msgstr "Ver elementos coma unha lista." + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Directories & Files:" +msgstr "Directorios e Arquivos:" + +#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp +#: editor/plugins/style_box_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp +msgid "Preview:" +msgstr "Vista Previa:" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "File:" +msgstr "Arquivo:" + +#: editor/editor_file_system.cpp +msgid "ScanSources" +msgstr "Escanear Fontes" + +#: editor/editor_file_system.cpp +msgid "" +"There are multiple importers for different types pointing to file %s, import " +"aborted" +msgstr "" + +#: editor/editor_file_system.cpp +msgid "(Re)Importing Assets" +msgstr "(Re)Importando Assets" + +#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp +msgid "Top" +msgstr "Superior" + +#: editor/editor_help.cpp +msgid "Class:" +msgstr "Clase:" + +#: editor/editor_help.cpp editor/scene_tree_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Inherits:" +msgstr "Herda de:" + +#: editor/editor_help.cpp +msgid "Inherited by:" +msgstr "Herdado de:" + +#: editor/editor_help.cpp +msgid "Description" +msgstr "Descrición" + +#: editor/editor_help.cpp +msgid "Online Tutorials" +msgstr "Tutoriales en liña" + +#: editor/editor_help.cpp +msgid "Properties" +msgstr "Propiedades" + +#: editor/editor_help.cpp +msgid "override:" +msgstr "sobrescribir:" + +#: editor/editor_help.cpp +msgid "default:" +msgstr "por defecto:" + +#: editor/editor_help.cpp +msgid "Methods" +msgstr "Métodos" + +#: editor/editor_help.cpp +#, fuzzy +msgid "Theme Properties" +msgstr "Propiedades do Tema" + +#: editor/editor_help.cpp +msgid "Enumerations" +msgstr "" + +#: editor/editor_help.cpp +msgid "Constants" +msgstr "Constantes" + +#: editor/editor_help.cpp +msgid "Property Descriptions" +msgstr "Descrición de Propiedades" + +#: editor/editor_help.cpp +msgid "(value)" +msgstr "(valor)" + +#: editor/editor_help.cpp +msgid "" +"There is currently no description for this property. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"Actualmente non hai unha descripción desta propiedade. Axúdanos [color=" +"$color][url=$url]contribuíndo cunha descripción[/url][/color]!" + +#: editor/editor_help.cpp +msgid "Method Descriptions" +msgstr "Descrición de Métodos" + +#: editor/editor_help.cpp +msgid "" +"There is currently no description for this method. Please help us by [color=" +"$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"Actualmente non hai unha descripción deste método. Axúdanos [color=$color]" +"[url=$url]contribuíndo cunha descripción[/url][/color]!" + +#: editor/editor_help_search.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp +msgid "Search Help" +msgstr "Buscar na Axuda" + +#: editor/editor_help_search.cpp +msgid "Case Sensitive" +msgstr "Distinguir Maíusculas e Minúsculas" + +#: editor/editor_help_search.cpp +msgid "Show Hierarchy" +msgstr "Amosar Xerarquía" + +#: editor/editor_help_search.cpp +msgid "Display All" +msgstr "Amosar Todo" + +#: editor/editor_help_search.cpp +msgid "Classes Only" +msgstr "Só Clases" + +#: editor/editor_help_search.cpp +msgid "Methods Only" +msgstr "Só Métodos" + +#: editor/editor_help_search.cpp +msgid "Signals Only" +msgstr "Só Sinais" + +#: editor/editor_help_search.cpp +msgid "Constants Only" +msgstr "Só Constantes" + +#: editor/editor_help_search.cpp +msgid "Properties Only" +msgstr "Só Propiedades" + +#: editor/editor_help_search.cpp +msgid "Theme Properties Only" +msgstr "Só Propiedades de Temas" + +#: editor/editor_help_search.cpp +msgid "Member Type" +msgstr "Tipo do Membro" + +#: editor/editor_help_search.cpp +msgid "Class" +msgstr "Clase" + +#: editor/editor_help_search.cpp +msgid "Method" +msgstr "Método" + +#: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp +msgid "Signal" +msgstr "Sinal" + +#: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp +msgid "Constant" +msgstr "Constante" + +#: editor/editor_help_search.cpp +msgid "Property" +msgstr "Propiedade" + +#: editor/editor_help_search.cpp +msgid "Theme Property" +msgstr "Propiedade de Temas" + +#: editor/editor_inspector.cpp editor/project_settings_editor.cpp +msgid "Property:" +msgstr "Propiedade:" + +#: editor/editor_inspector.cpp +msgid "Set" +msgstr "Establecer" + +#: editor/editor_inspector.cpp +msgid "Set Multiple:" +msgstr "Establecer Varios:" + +#: editor/editor_log.cpp +msgid "Output:" +msgstr "Saída:" + +#: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp +msgid "Copy Selection" +msgstr "Copiar Selección" + +#: editor/editor_log.cpp editor/editor_network_profiler.cpp +#: editor/editor_profiler.cpp editor/editor_properties.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/property_editor.cpp editor/scene_tree_dock.cpp +#: editor/script_editor_debugger.cpp +#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp +msgid "Clear" +msgstr "Limpar" + +#: editor/editor_log.cpp +msgid "Clear Output" +msgstr "Limpar Saída" + +#: editor/editor_network_profiler.cpp editor/editor_node.cpp +#: editor/editor_profiler.cpp +msgid "Stop" +msgstr "Deter" + +#: editor/editor_network_profiler.cpp editor/editor_profiler.cpp +#: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp +msgid "Start" +msgstr "Iniciar" + +#: editor/editor_network_profiler.cpp +msgid "%s/s" +msgstr "%s/s" + +#: editor/editor_network_profiler.cpp +msgid "Down" +msgstr "Baixada" + +#: editor/editor_network_profiler.cpp +msgid "Up" +msgstr "Subida" + +#: editor/editor_network_profiler.cpp editor/editor_node.cpp +msgid "Node" +msgstr "Nodo" + +#: editor/editor_network_profiler.cpp +msgid "Incoming RPC" +msgstr "RPC Entrante" + +#: editor/editor_network_profiler.cpp +msgid "Incoming RSET" +msgstr "RSET Entrante" + +#: editor/editor_network_profiler.cpp +msgid "Outgoing RPC" +msgstr "RPC Saínte" + +#: editor/editor_network_profiler.cpp +msgid "Outgoing RSET" +msgstr "RSET Saínte" + +#: editor/editor_node.cpp editor/project_manager.cpp +msgid "New Window" +msgstr "Nova Xanela" + +#: editor/editor_node.cpp +msgid "Imported resources can't be saved." +msgstr "Os recursos importados non se poden gardar." + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: scene/gui/dialogs.cpp +msgid "OK" +msgstr "Vale" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Error saving resource!" +msgstr "Erro gardando o recurso!" + +#: editor/editor_node.cpp +msgid "" +"This resource can't be saved because it does not belong to the edited scene. " +"Make it unique first." +msgstr "" +"Este recurso non pode gardarse porque non pertence á escena actual. Primero " +"fágao único." + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Save Resource As..." +msgstr "Gardar Recurso Como..." + +#: editor/editor_node.cpp +msgid "Can't open file for writing:" +msgstr "Non se puido abrir o arquivo para escritura:" + +#: editor/editor_node.cpp +msgid "Requested file format unknown:" +msgstr "O formato do arquivo solicitado é descoñecido:" + +#: editor/editor_node.cpp +msgid "Error while saving." +msgstr "Erro ao gardar." + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Can't open '%s'. The file could have been moved or deleted." +msgstr "" +"Non se puido abrir '%s'. Pode ser que o arquivo fose movido ou eliminado." + +#: editor/editor_node.cpp +msgid "Error while parsing '%s'." +msgstr "Erro ao analizar sintacticamente '%s'." + +#: editor/editor_node.cpp +msgid "Unexpected end of file '%s'." +msgstr "Fin de arquivo inesperado en '%s'." + +#: editor/editor_node.cpp +msgid "Missing '%s' or its dependencies." +msgstr "Non se encontrou '%s' ou as súas dependencias." + +#: editor/editor_node.cpp +msgid "Error while loading '%s'." +msgstr "Erro ao cargar '%s'." + +#: editor/editor_node.cpp +msgid "Saving Scene" +msgstr "Gardando Escena" + +#: editor/editor_node.cpp +msgid "Analyzing" +msgstr "Analizando" + +#: editor/editor_node.cpp +msgid "Creating Thumbnail" +msgstr "Creando Miniatura" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a tree root." +msgstr "Esta operación non pode realizarse sen un nodo raíz." + +#: editor/editor_node.cpp +msgid "" +"This scene can't be saved because there is a cyclic instancing inclusion.\n" +"Please resolve it and then attempt to save again." +msgstr "" +"Esta escena non pode gardarse porque hai unha relación de instanciación " +"cíclica con outra escena.\n" +"Por favor, solucione o problema e inténteo de novo." + +#: editor/editor_node.cpp +msgid "" +"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't " +"be satisfied." +msgstr "" +"Non se puido gardar a escena. Posiblemente as dependencias (instancias ou " +"herenzas) non puideron satisfacerse." + +#: editor/editor_node.cpp editor/scene_tree_dock.cpp +msgid "Can't overwrite scene that is still open!" +msgstr "Non se pode sobreescribir escena que sigue aberta!" + +#: editor/editor_node.cpp +msgid "Can't load MeshLibrary for merging!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error saving MeshLibrary!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Can't load TileSet for merging!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error saving TileSet!" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"An error occurred while trying to save the editor layout.\n" +"Make sure the editor's user data path is writable." +msgstr "" +"Produciuse un erro mentres se trataba de gardar a disposición das ventás do " +"editor.\n" +"Asegúrese de que o cartafol do editor ten dereitos de escritura." + +#: editor/editor_node.cpp +msgid "" +"Default editor layout overridden.\n" +"To restore the Default layout to its base settings, use the Delete Layout " +"option and delete the Default layout." +msgstr "" +"A disposición por defecto do editor foi sobreescrita.\n" +"Para devolver a disposición por defecto a súa configuración orixinal, usa a " +"opción 'Eliminar Disposición' e elimina a Disposición por defecto." + +#: editor/editor_node.cpp +msgid "Layout name not found!" +msgstr "Nome de disposición non encontrada!" + +#: editor/editor_node.cpp +msgid "Restored the Default layout to its base settings." +msgstr "Restableceuse a disposición por defecto aos seus valores orixinais." + +#: editor/editor_node.cpp +msgid "" +"This resource belongs to a scene that was imported, so it's not editable.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" +"Este recurso pertence a unha escena importada, polo que non é editable.\n" +"Por favor; lea a documentación referente a importación de escenas para " +"entender o fluxo de traballo." + +#: editor/editor_node.cpp +msgid "" +"This resource belongs to a scene that was instanced or inherited.\n" +"Changes to it won't be kept when saving the current scene." +msgstr "" +"Este recurso pertence a unha escena instanciada ou herdada.\n" +"Os cambios que lle faga non se gardarán cando garde a escena actual." + +#: editor/editor_node.cpp +msgid "" +"This resource was imported, so it's not editable. Change its settings in the " +"import panel and then re-import." +msgstr "" +"Este recurso foi importado, polo que non é editable. Cambia a súa " +"configuración no panel de importación, e reimportao." + +#: editor/editor_node.cpp +msgid "" +"This scene was imported, so changes to it won't be kept.\n" +"Instancing it or inheriting will allow making changes to it.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" +"Esta escena foi importada, polo que cambios na escena non serán gardados.\n" +"Instanciala ou herdala permitirá facerlle cambios permanentes.\n" +"Por favor, lea a documentación referente a importación de escenas para " +"entender o fluxo de traballo." + +#: editor/editor_node.cpp +msgid "" +"This is a remote object, so changes to it won't be kept.\n" +"Please read the documentation relevant to debugging to better understand " +"this workflow." +msgstr "" +"Este é un obxecto remoto, polo que os cambios que lle faga non serán " +"permanentes.\n" +"Por favor; lea a documentación referente a depuración para entender o fluxo " +"de traballo." + +#: editor/editor_node.cpp +msgid "There is no defined scene to run." +msgstr "Non hai unha escena definida para executar." + +#: editor/editor_node.cpp +msgid "Save scene before running..." +msgstr "Garda a escena antes de executala..." + +#: editor/editor_node.cpp +msgid "Could not start subprocess!" +msgstr "Non se puido iniciar subproceso!" + +#: editor/editor_node.cpp editor/filesystem_dock.cpp +msgid "Open Scene" +msgstr "Abrir Escena" + +#: editor/editor_node.cpp +msgid "Open Base Scene" +msgstr "Abrir Escena Base" + +#: editor/editor_node.cpp +msgid "Quick Open..." +msgstr "Apertura Rápida..." + +#: editor/editor_node.cpp +msgid "Quick Open Scene..." +msgstr "Apertura Rápida de Escena..." + +#: editor/editor_node.cpp +msgid "Quick Open Script..." +msgstr "Apertura Rápida de Script..." + +#: editor/editor_node.cpp +msgid "Save & Close" +msgstr "Gardar e Pechar" + +#: editor/editor_node.cpp +msgid "Save changes to '%s' before closing?" +msgstr "Gardar os cambios de '%s' antes de pechar?" + +#: editor/editor_node.cpp +msgid "Saved %s modified resource(s)." +msgstr "Gardado(s) %s recurso(s) modificado(s)." + +#: editor/editor_node.cpp +msgid "A root node is required to save the scene." +msgstr "Necesítase un nodo raíz para gardar a escena." + +#: editor/editor_node.cpp +msgid "Save Scene As..." +msgstr "Gardar Escena Como..." + +#: editor/editor_node.cpp editor/scene_tree_dock.cpp +msgid "This operation can't be done without a scene." +msgstr "Esta operación non pode realizarse se unha escena." + +#: editor/editor_node.cpp +msgid "Export Mesh Library" +msgstr "Exportar Biblioteca de Mallas" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a root node." +msgstr "Esta operación non pode realizarse sen un nodo raíz." + +#: editor/editor_node.cpp +msgid "Export Tile Set" +msgstr "" + +#: editor/editor_node.cpp +msgid "This operation can't be done without a selected node." +msgstr "Esta operación non pode realizarse sen un nodo seleccionado." + +#: editor/editor_node.cpp +msgid "Current scene not saved. Open anyway?" +msgstr "Escena actual non gardada ¿Abrir de todos os modos?" + +#: editor/editor_node.cpp +msgid "Can't reload a scene that was never saved." +msgstr "Non se pode volver a cargar unha escena que nunca foi gardada." + +#: editor/editor_node.cpp +msgid "Reload Saved Scene" +msgstr "Recargar Escena Gardada" + +#: editor/editor_node.cpp +msgid "" +"The current scene has unsaved changes.\n" +"Reload the saved scene anyway? This action cannot be undone." +msgstr "" +"A escena actual ten cambios non gardados.\n" +"Quere volver a cargar a escena cargada de todos os modos? Esta acción non se " +"pode deshacer." + +#: editor/editor_node.cpp +msgid "Quick Run Scene..." +msgstr "Execución Rápida de Escena..." + +#: editor/editor_node.cpp +msgid "Quit" +msgstr "Saír" + +#: editor/editor_node.cpp +msgid "Yes" +msgstr "Si" + +#: editor/editor_node.cpp +msgid "Exit the editor?" +msgstr "Saír do editor?" + +#: editor/editor_node.cpp +msgid "Open Project Manager?" +msgstr "Abrir o Administrador de Proxectos?" + +#: editor/editor_node.cpp +msgid "Save & Quit" +msgstr "Gardar e Saír" + +#: editor/editor_node.cpp +msgid "Save changes to the following scene(s) before quitting?" +msgstr "Gardar os cambios nas seguintes escenas antes de saír?" + +#: editor/editor_node.cpp +msgid "Save changes the following scene(s) before opening Project Manager?" +msgstr "" +"Gardar os cambios nas seguintes escenas antes de abrir o Administrador de " +"Proxectos?" + +#: editor/editor_node.cpp +msgid "" +"This option is deprecated. Situations where refresh must be forced are now " +"considered a bug. Please report." +msgstr "" +"Esta opción está anticuada. As situacións nas que a actualización debe ser " +"forzada agora considéranse un erro. Por favor, repórtao." + +#: editor/editor_node.cpp +msgid "Pick a Main Scene" +msgstr "Elexir unha Escena Principal" + +#: editor/editor_node.cpp +msgid "Close Scene" +msgstr "Pechar Escena" + +#: editor/editor_node.cpp +msgid "Reopen Closed Scene" +msgstr "Reabrir Escena Pechada" + +#: editor/editor_node.cpp +msgid "Unable to enable addon plugin at: '%s' parsing of config failed." +msgstr "" +"Non se puido activar a característica adicional (Plugin): Fallou a análise " +"sintáctica da configuración de '%s'." + +#: editor/editor_node.cpp +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "" +"Non se puido encontrar o campo do Script na característica adicional " +"(Plugin) en 'res://addons/%s'." + +#: editor/editor_node.cpp +msgid "Unable to load addon script from path: '%s'." +msgstr "" +"Non se puido cargar Script de característica adicional (Addon) na ruta: '%s'." + +#: editor/editor_node.cpp +msgid "" +"Unable to load addon script from path: '%s' There seems to be an error in " +"the code, please check the syntax." +msgstr "" +"Non se puido cargar Script de característica adicional (Addon) na ruta: " +"'%s'. Parece que hai un erro no código; por favor, comproba a sintaxe." + +#: editor/editor_node.cpp +msgid "" +"Unable to load addon script from path: '%s' Base type is not EditorPlugin." +msgstr "" +"Non se puido cargar o Script da característica adicional (Plugin): O tipo " +"base de %s non é EditorPlugin." + +#: editor/editor_node.cpp +msgid "Unable to load addon script from path: '%s' Script is not in tool mode." +msgstr "" +"Non se puido cargar Script de característica adicional (Addon) na ruta: " +"'%s'. O script non está en modo ferramenta (tool)." + +#: editor/editor_node.cpp +msgid "" +"Scene '%s' was automatically imported, so it can't be modified.\n" +"To make changes to it, a new inherited scene can be created." +msgstr "" +"A escena '%s' foi automáticamente importada, polo que non pode modificarse.\n" +"Para facerlle cambios pódese crear unha nova escena herdada." + +#: editor/editor_node.cpp +msgid "" +"Error loading scene, it must be inside the project path. Use 'Import' to " +"open the scene, then save it inside the project path." +msgstr "" +"Erro cargando a escena: debe estar dentro da ruta do proxecto. Usa \"Importar" +"\" para abrir a escena, e despois gardala dentro da ruta do proxecto." + +#: editor/editor_node.cpp +msgid "Scene '%s' has broken dependencies:" +msgstr "A escena '%s' ten dependencias rotas:" + +#: editor/editor_node.cpp +msgid "Clear Recent Scenes" +msgstr "Limpar Escenas Recentes" + +#: editor/editor_node.cpp +msgid "" +"No main scene has ever been defined, select one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" +"Nunca se definiu unha escena principal. Seleccionar unha?\n" +"Podes cambialo despois na \"Configuración do Proxecto\", na categoría " +"\"Aplicación\"." + +#: editor/editor_node.cpp +msgid "" +"Selected scene '%s' does not exist, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" +"A escena seleccionada '%s' non existe. Seleccionar unha válida?\n" +"Podes cambiala despois en \"Configuración do Proxecto\" na categoría " +"\"aplicación\"." + +#: editor/editor_node.cpp +msgid "" +"Selected scene '%s' is not a scene file, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" +"A escena seleccionada '%s' non é un arquivo de escenas. Seleccionar un " +"arquivo válido?\n" +"Podes cambialo despois en \"Configuración do Proxecto\" na categoría " +"\"aplicación\"." + +#: editor/editor_node.cpp +msgid "Save Layout" +msgstr "Gardar Disposición" + +#: editor/editor_node.cpp +msgid "Delete Layout" +msgstr "Eliminar Dispoción" + +#: editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp +msgid "Default" +msgstr "Por Defecto" + +#: editor/editor_node.cpp editor/editor_properties.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp +msgid "Show in FileSystem" +msgstr "Amosar no Sistema de Arquivos" + +#: editor/editor_node.cpp +msgid "Play This Scene" +msgstr "Reproducir Esta Escena" + +#: editor/editor_node.cpp +msgid "Close Tab" +msgstr "Pechar Pestana" + +#: editor/editor_node.cpp +msgid "Undo Close Tab" +msgstr "Desfacer Pechar Pestana" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Close Other Tabs" +msgstr "Pechar Outras Pestanas" + +#: editor/editor_node.cpp +msgid "Close Tabs to the Right" +msgstr "Pechar Pestanas á Dereita" + +#: editor/editor_node.cpp +msgid "Close All Tabs" +msgstr "Pechar Todas as Pestanas" + +#: editor/editor_node.cpp +msgid "Switch Scene Tab" +msgstr "" + +#: editor/editor_node.cpp +msgid "%d more files or folders" +msgstr "%d arquivos ou cartafois máis" + +#: editor/editor_node.cpp +msgid "%d more folders" +msgstr "%d cartafois máis" + +#: editor/editor_node.cpp +msgid "%d more files" +msgstr "%d arquivos máis" + +#: editor/editor_node.cpp +msgid "Dock Position" +msgstr "Posición do Panel" + +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "Modo Sen Distraccións" + +#: editor/editor_node.cpp +msgid "Toggle distraction-free mode." +msgstr "Act./Desact. modo sen distraccións." + +#: editor/editor_node.cpp +msgid "Add a new scene." +msgstr "Engadir unha nova escena." + +#: editor/editor_node.cpp +msgid "Scene" +msgstr "Escena" + +#: editor/editor_node.cpp +msgid "Go to previously opened scene." +msgstr "Ir á escena aberta previamente." + +#: editor/editor_node.cpp +msgid "Copy Text" +msgstr "Copiar Texto" + +#: editor/editor_node.cpp +msgid "Next tab" +msgstr "Seguinte pestana" + +#: editor/editor_node.cpp +msgid "Previous tab" +msgstr "Anterior Pestana" + +#: editor/editor_node.cpp +msgid "Filter Files..." +msgstr "Filtrar Arquivos..." + +#: editor/editor_node.cpp +msgid "Operations with scene files." +msgstr "Operacións con arquivos de escenas." + +#: editor/editor_node.cpp +msgid "New Scene" +msgstr "Nova Escena" + +#: editor/editor_node.cpp +msgid "New Inherited Scene..." +msgstr "Nova Escena Herdada..." + +#: editor/editor_node.cpp +msgid "Open Scene..." +msgstr "Abrir Escena..." + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Open Recent" +msgstr "Abrir Recente" + +#: editor/editor_node.cpp +msgid "Save Scene" +msgstr "Gardar Escena" + +#: editor/editor_node.cpp +msgid "Save All Scenes" +msgstr "Gardar Todas as Escenas" + +#: editor/editor_node.cpp +msgid "Convert To..." +msgstr "Converter a..." + +#: editor/editor_node.cpp +msgid "MeshLibrary..." +msgstr "" + +#: editor/editor_node.cpp +msgid "TileSet..." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Undo" +msgstr "Desfacer" + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Redo" +msgstr "Refacer" + +#: editor/editor_node.cpp +msgid "Miscellaneous project or scene-wide tools." +msgstr "Ferramentas varias do proxecto ou escena." + +#: editor/editor_node.cpp editor/project_manager.cpp +#: editor/script_create_dialog.cpp +msgid "Project" +msgstr "Proxecto" + +#: editor/editor_node.cpp +msgid "Project Settings..." +msgstr "Axustes do Proxecto..." + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control" +msgstr "Control de Versións" + +#: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp +msgid "Set Up Version Control" +msgstr "Configurar Control de Versións" + +#: editor/editor_node.cpp +msgid "Shut Down Version Control" +msgstr "Desactivar Control de Versións" + +#: editor/editor_node.cpp +msgid "Export..." +msgstr "Exportar..." + +#: editor/editor_node.cpp +msgid "Install Android Build Template..." +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Project Data Folder" +msgstr "Abrir Cartafol de Datos do Proxecto" + +#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp +msgid "Tools" +msgstr "Ferramentas" + +#: editor/editor_node.cpp +msgid "Orphan Resource Explorer..." +msgstr "Explorador de Recursos Orfos..." + +#: editor/editor_node.cpp +msgid "Quit to Project List" +msgstr "Saír á Lista de Proxectos" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/project_export.cpp +msgid "Debug" +msgstr "Depuración" + +#: editor/editor_node.cpp +msgid "Deploy with Remote Debug" +msgstr "Exportar con Depuración Remota" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, using one-click deploy will make the executable " +"attempt to connect to this computer's IP so the running project can be " +"debugged.\n" +"This option is intended to be used for remote debugging (typically with a " +"mobile device).\n" +"You don't need to enable it to use the GDScript debugger locally." +msgstr "" +"Cando esta opción está activada, usar o despregue dun só clic fará que o " +"executable intente conectarse a IP deste computador, para poder depurar o " +"proxecto mentres este está executandose no dispositivo.\n" +"Esta opción está pensada para ser utilizada coa depuración remota " +"(normalmente nun dispositivo móbil).\n" +"Non necesita activar esta opción para utilizar o depurador de GDScript de " +"forma local." + +#: editor/editor_node.cpp +msgid "Small Deploy with Network Filesystem" +msgstr "Exportación Reducida co Sistema de Arquivos en Rede" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, using one-click deploy for Android will only " +"export an executable without the project data.\n" +"The filesystem will be provided from the project by the editor over the " +"network.\n" +"On Android, deploying will use the USB cable for faster performance. This " +"option speeds up testing for projects with large assets." +msgstr "" +"Cando esta opción está activada, usar o despregue don só clic para Android " +"exportará só o executable, sen os datos do proxecto.\n" +"O sistema de arquivos proporcionarase por o editor na rede.\n" +"En Android ao despregar a aplicación usarase o USB para obter maior " +"rendemento. Esta opción acelera o proceso de proba en proxectos con gran " +"cantidade de Assets." + +#: editor/editor_node.cpp +msgid "Visible Collision Shapes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, collision shapes and raycast nodes (for 2D and " +"3D) will be visible in the running project." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Navigation" +msgstr "Navegación Visible" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, navigation meshes and polygons will be visible " +"in the running project." +msgstr "" + +#: editor/editor_node.cpp +msgid "Synchronize Scene Changes" +msgstr "Sincronizar Cambios na Escena" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, any changes made to the scene in the editor " +"will be replicated in the running project.\n" +"When used remotely on a device, this is more efficient when the network " +"filesystem option is enabled." +msgstr "" +"Cando esta opción está activada, calquera cambio na escena no editor verase " +"reflectido no proxecto en execución.\n" +"Cando é usado remotamente nun dispositivo, é máis eficiente cando o sistema " +"de arquivos en rede está activado." + +#: editor/editor_node.cpp +msgid "Synchronize Script Changes" +msgstr "Sincronizar Cambios nos Scripts" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, any script that is saved will be reloaded in " +"the running project.\n" +"When used remotely on a device, this is more efficient when the network " +"filesystem option is enabled." +msgstr "" +"Cando esta opción está activada, calquera script gardada será recargada no " +"proxecto mentras este está en execución.\n" +"Cando é usado remotamente nun dispositivo, é máis eficiente cando o sistema " +"de arquivos en rede está activado." + +#: editor/editor_node.cpp editor/script_create_dialog.cpp +msgid "Editor" +msgstr "Editor" + +#: editor/editor_node.cpp +msgid "Editor Settings..." +msgstr "Configuración do Editor..." + +#: editor/editor_node.cpp +msgid "Editor Layout" +msgstr "Disposición das Ventás do Editor" + +#: editor/editor_node.cpp +msgid "Take Screenshot" +msgstr "Captura de Pantalla" + +#: editor/editor_node.cpp +msgid "Screenshots are stored in the Editor Data/Settings Folder." +msgstr "" +"As capturas de pantalla gárdanse no cartafol de Datos/Configuración do " +"Editor." + +#: editor/editor_node.cpp +msgid "Toggle Fullscreen" +msgstr "Act./Desact. Pantalla Completa" + +#: editor/editor_node.cpp +msgid "Toggle System Console" +msgstr "Act./Desact. Consola do Sistema" + +#: editor/editor_node.cpp +msgid "Open Editor Data/Settings Folder" +msgstr "Abrir Cartafol de Datos/Configuración do Editor" + +#: editor/editor_node.cpp +msgid "Open Editor Data Folder" +msgstr "Abrir Cartafol de Datos do Editor" + +#: editor/editor_node.cpp +msgid "Open Editor Settings Folder" +msgstr "Abrir Cartafol de Configuración do Editor" + +#: editor/editor_node.cpp +msgid "Manage Editor Features..." +msgstr "Administrar Características do Editor..." + +#: editor/editor_node.cpp +msgid "Manage Export Templates..." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp +msgid "Help" +msgstr "Axuda" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Online Docs" +msgstr "Documentación En Liña" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "Preguntas e Respostas" + +#: editor/editor_node.cpp +msgid "Report a Bug" +msgstr "Reportar un Erro" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "Reportar Problema ca Documentación" + +#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp +msgid "Community" +msgstr "Comunidade" + +#: editor/editor_node.cpp +msgid "About" +msgstr "Acerca De" + +#: editor/editor_node.cpp +msgid "Play the project." +msgstr "Reproduce o proxecto." + +#: editor/editor_node.cpp +msgid "Play" +msgstr "Executar" + +#: editor/editor_node.cpp +msgid "Pause the scene execution for debugging." +msgstr "Pausa a execución da escena para a depuración." + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "Pausar Escena" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "Detén a escena." + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "Reproduce a escena actual." + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "Executar Escena" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "Executar escena a elixir" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "Executar Escena a Elixir" + +#: editor/editor_node.cpp +msgid "Changing the video driver requires restarting the editor." +msgstr "Cambiar o controlador de vídeo require reiniciar o editor." + +#: editor/editor_node.cpp editor/project_settings_editor.cpp +#: editor/settings_config_dialog.cpp +msgid "Save & Restart" +msgstr "Gardar e Reinicar" + +#: editor/editor_node.cpp +msgid "Spins when the editor window redraws." +msgstr "Xira cando o editor actualiza a pantalla." + +#: editor/editor_node.cpp +msgid "Update Continuously" +msgstr "Actualizar de Maneira Continua" + +#: editor/editor_node.cpp +msgid "Update When Changed" +msgstr "Actualizar Cando Sexa Necesario" + +#: editor/editor_node.cpp +msgid "Hide Update Spinner" +msgstr "" + +#: editor/editor_node.cpp +msgid "FileSystem" +msgstr "Sistema de Arquivos" + +#: editor/editor_node.cpp +msgid "Inspector" +msgstr "Inspector" + +#: editor/editor_node.cpp +msgid "Expand Bottom Panel" +msgstr "Estender Panel Inferior" + +#: editor/editor_node.cpp +msgid "Output" +msgstr "Saída" + +#: editor/editor_node.cpp +msgid "Don't Save" +msgstr "Non Gardar" + +#: editor/editor_node.cpp +msgid "Android build template is missing, please install relevant templates." +msgstr "" + +#: editor/editor_node.cpp +msgid "Manage Templates" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"This will set up your project for custom Android builds by installing the " +"source template to \"res://android/build\".\n" +"You can then apply modifications and build your own custom APK on export " +"(adding modules, changing the AndroidManifest.xml, etc.).\n" +"Note that in order to make custom builds instead of using pre-built APKs, " +"the \"Use Custom Build\" option should be enabled in the Android export " +"preset." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"The Android build template is already installed in this project and it won't " +"be overwritten.\n" +"Remove the \"res://android/build\" directory manually before attempting this " +"operation again." +msgstr "" + +#: editor/editor_node.cpp +msgid "Import Templates From ZIP File" +msgstr "" + +#: editor/editor_node.cpp +msgid "Template Package" +msgstr "" + +#: editor/editor_node.cpp +msgid "Export Library" +msgstr "Biblioteca de Exportación" + +#: editor/editor_node.cpp +msgid "Merge With Existing" +msgstr "Combinar Con Existentes" + +#: editor/editor_node.cpp +msgid "Open & Run a Script" +msgstr "Abrir e Executar un Script" + +#: editor/editor_node.cpp +#, fuzzy +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"Este shader foi modificado en disco.\n" +"Que acción deberían de tomarse?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Recargar" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Volver a Gardar" + +#: editor/editor_node.cpp +msgid "New Inherited" +msgstr "Nova Escena Herdada" + +#: editor/editor_node.cpp +msgid "Load Errors" +msgstr "Erros durante a Carga" + +#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp +msgid "Select" +msgstr "Elixir" + +#: editor/editor_node.cpp +msgid "Open 2D Editor" +msgstr "Abrir Editor 2D" + +#: editor/editor_node.cpp +msgid "Open 3D Editor" +msgstr "Abrir Editor 3D" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "Abrir Editor de Scripts" + +#: editor/editor_node.cpp editor/project_manager.cpp +msgid "Open Asset Library" +msgstr "Abrir Biblioteca de Assets" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "Abrir o seguinte editor" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "Abrir o anterior editor" + +#: editor/editor_node.h +msgid "Warning!" +msgstr "Aviso!" + +#: editor/editor_path.cpp +msgid "No sub-resources found." +msgstr "Non se atopou ningún sub-recurso." + +#: editor/editor_plugin.cpp +msgid "Creating Mesh Previews" +msgstr "Creando Previsualización de Mallas" + +#: editor/editor_plugin.cpp +msgid "Thumbnail..." +msgstr "Miniatura..." + +#: editor/editor_plugin_settings.cpp +msgid "Main Script:" +msgstr "Script Principal:" + +#: editor/editor_plugin_settings.cpp +msgid "Edit Plugin" +msgstr "Editar Característica Adicional (Plugin)" + +#: editor/editor_plugin_settings.cpp +msgid "Installed Plugins:" +msgstr "Características Adicionais (Plugins) Instalados:" + +#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp +msgid "Update" +msgstr "Actualizar" + +#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Version:" +msgstr "Versión:" + +#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp +msgid "Author:" +msgstr "Autor:" + +#: editor/editor_plugin_settings.cpp +msgid "Status:" +msgstr "Estado:" + +#: editor/editor_plugin_settings.cpp +msgid "Edit:" +msgstr "Editar:" + +#: editor/editor_profiler.cpp +msgid "Measure:" +msgstr "Medida:" + +#: editor/editor_profiler.cpp +msgid "Frame Time (sec)" +msgstr "Duración de Fotograma (seg)" + +#: editor/editor_profiler.cpp +msgid "Average Time (sec)" +msgstr "Tempo Medio (seg)" + +#: editor/editor_profiler.cpp +msgid "Frame %" +msgstr "Fotograma %" + +#: editor/editor_profiler.cpp +msgid "Physics Frame %" +msgstr "Fotograma de Física %" + +#: editor/editor_profiler.cpp +msgid "Inclusive" +msgstr "Inclusivo" + +#: editor/editor_profiler.cpp +msgid "Self" +msgstr "Propio" + +#: editor/editor_profiler.cpp +msgid "Frame #:" +msgstr "Fotograma #:" + +#: editor/editor_profiler.cpp +msgid "Time" +msgstr "Tempo" + +#: editor/editor_profiler.cpp +msgid "Calls" +msgstr "Chamadas" + +#: editor/editor_properties.cpp +msgid "Edit Text:" +msgstr "Editar Texto:" + +#: editor/editor_properties.cpp editor/script_create_dialog.cpp +msgid "On" +msgstr "Activado" + +#: editor/editor_properties.cpp +msgid "Layer" +msgstr "Capa" + +#: editor/editor_properties.cpp +msgid "Bit %d, value %d" +msgstr "Bit %d, valor %d" + +#: editor/editor_properties.cpp +msgid "[Empty]" +msgstr "[Baleiro]" + +#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp +msgid "Assign..." +msgstr "Asignar..." + +#: editor/editor_properties.cpp +msgid "Invalid RID" +msgstr "Identificador de Recurso (RID) inválido" + +#: editor/editor_properties.cpp +msgid "" +"The selected resource (%s) does not match any type expected for this " +"property (%s)." +msgstr "" +"O recurso seleccionado (%s) non coincide con ningún tipo esperado para esta " +"propiedade (%s)." + +#: editor/editor_properties.cpp +msgid "" +"Can't create a ViewportTexture on resources saved as a file.\n" +"Resource needs to belong to a scene." +msgstr "" +"Non se pode crear un ViewportTexture nun recurso gardado coma un arquivo.\n" +"O recurso ten que pertencer a unha escena." + +#: editor/editor_properties.cpp +msgid "" +"Can't create a ViewportTexture on this resource because it's not set as " +"local to scene.\n" +"Please switch on the 'local to scene' property on it (and all resources " +"containing it up to a node)." +msgstr "" + +#: editor/editor_properties.cpp editor/property_editor.cpp +msgid "Pick a Viewport" +msgstr "Selecciona unha Mini-Ventá (Viewport)" + +#: editor/editor_properties.cpp editor/property_editor.cpp +msgid "New Script" +msgstr "Novo Script" + +#: editor/editor_properties.cpp editor/scene_tree_dock.cpp +msgid "Extend Script" +msgstr "Estender Script" + +#: editor/editor_properties.cpp editor/property_editor.cpp +msgid "New %s" +msgstr "Novo %s" + +#: editor/editor_properties.cpp editor/property_editor.cpp +msgid "Make Unique" +msgstr "Facer Único" + +#: editor/editor_properties.cpp +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Paste" +msgstr "Pegar" + +#: editor/editor_properties.cpp editor/property_editor.cpp +msgid "Convert To %s" +msgstr "Converter a %s" + +#: editor/editor_properties.cpp editor/property_editor.cpp +msgid "Selected node is not a Viewport!" +msgstr "O nodo seleccionado non é unha Mini-Ventá (Viewport)!" + +#: editor/editor_properties_array_dict.cpp +msgid "Size: " +msgstr "Tamaño: " + +#: editor/editor_properties_array_dict.cpp +msgid "Page: " +msgstr "Páxina: " + +#: editor/editor_properties_array_dict.cpp +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Item" +msgstr "Eliminar Elemento" + +#: editor/editor_properties_array_dict.cpp +msgid "New Key:" +msgstr "Nova Chave:" + +#: editor/editor_properties_array_dict.cpp +msgid "New Value:" +msgstr "Novo Valor:" + +#: editor/editor_properties_array_dict.cpp +msgid "Add Key/Value Pair" +msgstr "Engadir Parella Chave/Valor" + +#: editor/editor_run_native.cpp +msgid "" +"No runnable export preset found for this platform.\n" +"Please add a runnable preset in the Export menu or define an existing preset " +"as runnable." +msgstr "" +"Non se encontraron axustes de exportación executables para esta plataforma.\n" +"Engade uns axustes de exportación executables, ou define algún xa existente " +"como executable." + +#: editor/editor_run_script.cpp +msgid "Write your logic in the _run() method." +msgstr "Escribe a túa lóxica no método '_run()'." + +#: editor/editor_run_script.cpp +msgid "There is an edited scene already." +msgstr "Xa hai unha escena editada." + +#: editor/editor_run_script.cpp +msgid "Couldn't instance script:" +msgstr "Non se puido instanciar o script:" + +#: editor/editor_run_script.cpp +msgid "Did you forget the 'tool' keyword?" +msgstr "Olvidaches a palabra clave 'tool'?" + +#: editor/editor_run_script.cpp +msgid "Couldn't run script:" +msgstr "Non se puido executar o script:" + +#: editor/editor_run_script.cpp +msgid "Did you forget the '_run' method?" +msgstr "Olvidaches o método '_run'?" + +#: editor/editor_spin_slider.cpp +msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes." +msgstr "" +"Mantén pulsado Ctrl para redondear a enteiros. Mantén pulsado Shift para " +"cambios máis precisos." + +#: editor/editor_sub_scene.cpp +msgid "Select Node(s) to Import" +msgstr "Selecciona o(s) Nodo(s) a Importar" + +#: editor/editor_sub_scene.cpp editor/project_manager.cpp +msgid "Browse" +msgstr "Examinar" + +#: editor/editor_sub_scene.cpp +msgid "Scene Path:" +msgstr "Ruta da Escena:" + +#: editor/editor_sub_scene.cpp +msgid "Import From Node:" +msgstr "Importar Desde Nodo:" + +#: editor/export_template_manager.cpp +msgid "Redownload" +msgstr "Volver a Descargar" + +#: editor/export_template_manager.cpp +msgid "Uninstall" +msgstr "Desinstalar" + +#: editor/export_template_manager.cpp +msgid "(Installed)" +msgstr "(Instalado)" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download" +msgstr "Descargar" + +#: editor/export_template_manager.cpp +msgid "Official export templates aren't available for development builds." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "(Missing)" +msgstr "(Non encontrado)" + +#: editor/export_template_manager.cpp +msgid "(Current)" +msgstr "(Actual)" + +#: editor/export_template_manager.cpp +msgid "Retrieving mirrors, please wait..." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Remove template version '%s'?" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Can't open export templates zip." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Invalid version.txt format inside templates: %s." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "No version.txt found inside templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error creating path for templates:" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Extracting Export Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Importing:" +msgstr "Importando:" + +#: editor/export_template_manager.cpp +msgid "Error getting the list of mirrors." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error parsing JSON of mirror list. Please report this issue!" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"No download links found for this version. Direct download is only available " +"for official releases." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't resolve." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't connect." +msgstr "Non se pode conectar." + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No response." +msgstr "Sen resposta." + +#: editor/export_template_manager.cpp +msgid "Request Failed." +msgstr "A Petición Fracasou." + +#: editor/export_template_manager.cpp +msgid "Redirect Loop." +msgstr "" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed:" +msgstr "Fracasado:" + +#: editor/export_template_manager.cpp +msgid "Download Complete." +msgstr "Descarga Completa." + +#: editor/export_template_manager.cpp +msgid "Cannot remove temporary file:" +msgstr "Non se pode eliminar o arquivo temporal:" + +#: editor/export_template_manager.cpp +msgid "" +"Templates installation failed.\n" +"The problematic templates archives can be found at '%s'." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Error requesting URL:" +msgstr "Erro ao solicitar a URL:" + +#: editor/export_template_manager.cpp +msgid "Connecting to Mirror..." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Disconnected" +msgstr "Desconectado" + +#: editor/export_template_manager.cpp +msgid "Resolving" +msgstr "Resolvendo" + +#: editor/export_template_manager.cpp +msgid "Can't Resolve" +msgstr "Non se puido Resolver" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Connecting..." +msgstr "Conectando..." + +#: editor/export_template_manager.cpp +msgid "Can't Connect" +msgstr "Non se Pode Conectar" + +#: editor/export_template_manager.cpp +msgid "Connected" +msgstr "Conectado" + +#: editor/export_template_manager.cpp +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Requesting..." +msgstr "Solicitando..." + +#: editor/export_template_manager.cpp +msgid "Downloading" +msgstr "Descargando" + +#: editor/export_template_manager.cpp +msgid "Connection Error" +msgstr "Erro de Conexión" + +#: editor/export_template_manager.cpp +msgid "SSL Handshake Error" +msgstr "Erro SSL Handshake" + +#: editor/export_template_manager.cpp +msgid "Uncompressing Android Build Sources" +msgstr "Descomprimindo Recursos de Compilación de Android" + +#: editor/export_template_manager.cpp +msgid "Current Version:" +msgstr "Versión Actual:" + +#: editor/export_template_manager.cpp +msgid "Installed Versions:" +msgstr "Versións Instaladas:" + +#: editor/export_template_manager.cpp +msgid "Install From File" +msgstr "Instalar Dende Arquivo" + +#: editor/export_template_manager.cpp +msgid "Remove Template" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Select Template File" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Godot Export Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Export Template Manager" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Download Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Select mirror from list: (Shift+Click: Open in Browser)" +msgstr "Seleccione un mirror da lista: (Shift+Clic: Abrir no Navegador)" + +#: editor/filesystem_dock.cpp +msgid "Favorites" +msgstr "Favoritos" + +#: editor/filesystem_dock.cpp +msgid "Status: Import of file failed. Please fix file and reimport manually." +msgstr "" +"Estado: Fallou a importación do arquivo. Por favor, amaña o arquivo e " +"impórtao manualmente." + +#: editor/filesystem_dock.cpp +msgid "Cannot move/rename resources root." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot move a folder into itself." +msgstr "Non se pode mover un cartafol dentro de sí mesmo." + +#: editor/filesystem_dock.cpp +msgid "Error moving:" +msgstr "Erro ao mover:" + +#: editor/filesystem_dock.cpp +msgid "Error duplicating:" +msgstr "Erro ao duplicar:" + +#: editor/filesystem_dock.cpp +msgid "Unable to update dependencies:" +msgstr "Incapaz de actualizar dependencias:" + +#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp +msgid "No name provided." +msgstr "Nome non proporcionado." + +#: editor/filesystem_dock.cpp +msgid "Provided name contains invalid characters." +msgstr "O nome proporcionado contén caracteres inválidos." + +#: editor/filesystem_dock.cpp +msgid "A file or folder with this name already exists." +msgstr "Xa existe un arquivo ou cartafol con este nome." + +#: editor/filesystem_dock.cpp +msgid "Name contains invalid characters." +msgstr "O nome contén caracteres inválidos." + +#: editor/filesystem_dock.cpp +msgid "" +"The following files or folders conflict with items in the target location " +"'%s':\n" +"\n" +"%s\n" +"\n" +"Do you wish to overwrite them?" +msgstr "" +"Os seguintes arquivos ou cartafois entran en conflicto con elementos da " +"ubicación de destino '%s':\n" +"\n" +"%s\n" +"\n" +"Queres sobreescribilos?" + +#: editor/filesystem_dock.cpp +msgid "Renaming file:" +msgstr "Renomeando Arquivo:" + +#: editor/filesystem_dock.cpp +msgid "Renaming folder:" +msgstr "Renomeando Cartafol:" + +#: editor/filesystem_dock.cpp +msgid "Duplicating file:" +msgstr "Duplicando Arquivo:" + +#: editor/filesystem_dock.cpp +msgid "Duplicating folder:" +msgstr "Duplicando Cartafol:" + +#: editor/filesystem_dock.cpp +msgid "New Inherited Scene" +msgstr "Nova Escena Herdada" + +#: editor/filesystem_dock.cpp +msgid "Set As Main Scene" +msgstr "Establecer coma Escena Principal" + +#: editor/filesystem_dock.cpp +msgid "Open Scenes" +msgstr "Abrir Escenas" + +#: editor/filesystem_dock.cpp +msgid "Instance" +msgstr "Instanciar" + +#: editor/filesystem_dock.cpp +msgid "Add to Favorites" +msgstr "Engadir a Favoritos" + +#: editor/filesystem_dock.cpp +msgid "Remove from Favorites" +msgstr "Eliminar de Favoritos" + +#: editor/filesystem_dock.cpp +msgid "Edit Dependencies..." +msgstr "Editar Dependencias..." + +#: editor/filesystem_dock.cpp +msgid "View Owners..." +msgstr "Ver Donos..." + +#: editor/filesystem_dock.cpp +msgid "Move To..." +msgstr "Mover a..." + +#: editor/filesystem_dock.cpp +msgid "New Scene..." +msgstr "Nova Escena..." + +#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp +msgid "New Script..." +msgstr "Novo Script..." + +#: editor/filesystem_dock.cpp +msgid "New Resource..." +msgstr "Novo Recurso..." + +#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp +#: editor/script_editor_debugger.cpp +msgid "Expand All" +msgstr "Expandir Todo" + +#: editor/filesystem_dock.cpp editor/plugins/visual_shader_editor_plugin.cpp +#: editor/script_editor_debugger.cpp +msgid "Collapse All" +msgstr "Colapsar Todo" + +#: editor/filesystem_dock.cpp +msgid "Duplicate..." +msgstr "Duplicar..." + +#: editor/filesystem_dock.cpp +msgid "Move to Trash" +msgstr "Mover á Papeleira" + +#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp +msgid "Rename..." +msgstr "Renomear..." + +#: editor/filesystem_dock.cpp +msgid "Previous Folder/File" +msgstr "Anterior Cartafol/Arquivo" + +#: editor/filesystem_dock.cpp +msgid "Next Folder/File" +msgstr "Seguinte Cartafol/Arquivo" + +#: editor/filesystem_dock.cpp +msgid "Re-Scan Filesystem" +msgstr "Reexaminar Sistema de Arquivos" + +#: editor/filesystem_dock.cpp +msgid "Toggle Split Mode" +msgstr "Act./Desact. Modo Dividido" + +#: editor/filesystem_dock.cpp +msgid "Search files" +msgstr "Buscar arquivos" + +#: editor/filesystem_dock.cpp +msgid "" +"Scanning Files,\n" +"Please Wait..." +msgstr "" +"Examinando arquivos,\n" +"Por favor, espere..." + +#: editor/filesystem_dock.cpp +msgid "Move" +msgstr "Mover" + +#: editor/filesystem_dock.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/project_manager.cpp editor/rename_dialog.cpp +#: editor/scene_tree_dock.cpp +msgid "Rename" +msgstr "Renomear" + +#: editor/filesystem_dock.cpp +msgid "Overwrite" +msgstr "Sobreescribir" + +#: editor/filesystem_dock.cpp +msgid "Create Scene" +msgstr "Crear Escena" + +#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp +msgid "Create Script" +msgstr "Crear Script" + +#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp +msgid "Find in Files" +msgstr "Buscar en Arquivos" + +#: editor/find_in_files.cpp +msgid "Find:" +msgstr "Buscar:" + +#: editor/find_in_files.cpp +msgid "Folder:" +msgstr "Cartafol:" + +#: editor/find_in_files.cpp +msgid "Filters:" +msgstr "Filtros:" + +#: editor/find_in_files.cpp +msgid "" +"Include the files with the following extensions. Add or remove them in " +"ProjectSettings." +msgstr "" +"Inclúe os arquivos coas seguintes extensións. Engádeos ou elimínaos na " +"Configuración do proxecto." + +#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find..." +msgstr "Buscar..." + +#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp +msgid "Replace..." +msgstr "Substituír..." + +#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp +msgid "Cancel" +msgstr "Cancelar" + +#: editor/find_in_files.cpp +msgid "Find: " +msgstr "Buscar: " + +#: editor/find_in_files.cpp +msgid "Replace: " +msgstr "Substituír: " + +#: editor/find_in_files.cpp +msgid "Replace all (no undo)" +msgstr "Substituír todo (non se pode defacer)" + +#: editor/find_in_files.cpp +msgid "Searching..." +msgstr "Procurando..." + +#: editor/find_in_files.cpp +msgid "%d match in %d file." +msgstr "%d coincidencia en %d arquivo." + +#: editor/find_in_files.cpp +msgid "%d matches in %d file." +msgstr "%d coincidencias en %d arquivo." + +#: editor/find_in_files.cpp +msgid "%d matches in %d files." +msgstr "%d coincidencias en %d arquivos." + +#: editor/groups_editor.cpp +msgid "Add to Group" +msgstr "Engadir ao Grupo" + +#: editor/groups_editor.cpp +msgid "Remove from Group" +msgstr "Eliminar do Grupo" + +#: editor/groups_editor.cpp +msgid "Group name already exists." +msgstr "Este nome de grupo xa existe." + +#: editor/groups_editor.cpp +msgid "Invalid group name." +msgstr "Nome de grupo inválido." + +#: editor/groups_editor.cpp +msgid "Rename Group" +msgstr "Renomear Grupo" + +#: editor/groups_editor.cpp +msgid "Delete Group" +msgstr "Eliminar Grupo" + +#: editor/groups_editor.cpp editor/node_dock.cpp +msgid "Groups" +msgstr "Grupos" + +#: editor/groups_editor.cpp +msgid "Nodes Not in Group" +msgstr "Nodos Fora do Grupo" + +#: editor/groups_editor.cpp editor/scene_tree_dock.cpp +#: editor/scene_tree_editor.cpp +msgid "Filter nodes" +msgstr "Filtrar nodos" + +#: editor/groups_editor.cpp +msgid "Nodes in Group" +msgstr "Nodos no Grupo" + +#: editor/groups_editor.cpp +msgid "Empty groups will be automatically removed." +msgstr "Os grupos baleiros serán automaticamente eliminados." + +#: editor/groups_editor.cpp +msgid "Group Editor" +msgstr "Editor de Grupos" + +#: editor/groups_editor.cpp +msgid "Manage Groups" +msgstr "Administrar Grupos" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Single Scene" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Animations" +msgstr "Importar con Animacións Separadas" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Materials" +msgstr "Importar con Materiais Separados" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects" +msgstr "Importar con Obxectos Separados" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Materials" +msgstr "Importar con Obxectos e Materiais Separados" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Animations" +msgstr "Importar con Obxectos e Animacións Separadas" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Materials+Animations" +msgstr "Importar con Materiais e Animacións Separadas" + +#: editor/import/resource_importer_scene.cpp +msgid "Import with Separate Objects+Materials+Animations" +msgstr "Importar con Obxectos, Materiais, e Animacións Separados" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Multiple Scenes" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Import as Multiple Scenes+Materials" +msgstr "Importar como Escenas e Materiales Múltiples" + +#: editor/import/resource_importer_scene.cpp +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Import Scene" +msgstr "Importar Escena" + +#: editor/import/resource_importer_scene.cpp +msgid "Importing Scene..." +msgstr "Importando Escena..." + +#: editor/import/resource_importer_scene.cpp +msgid "Generating Lightmaps" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Generating for Mesh: " +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Running Custom Script..." +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Couldn't load post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Invalid/broken script for post-import (check console):" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Error running post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Did you return a Node-derived object in the `post_import()` method?" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +msgid "Saving..." +msgstr "Gardando..." + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Elixir Modo" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importación" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Cargar Valores por Defecto" + +#: editor/import_dock.cpp +msgid "%d Files" +msgstr "%d Arquivos" + +#: editor/import_dock.cpp +msgid "Set as Default for '%s'" +msgstr "" + +#: editor/import_dock.cpp +msgid "Clear Default for '%s'" +msgstr "" + +#: editor/import_dock.cpp +msgid "Import As:" +msgstr "Importar Como:" + +#: editor/import_dock.cpp +msgid "Preset" +msgstr "Axustes de Importación" + +#: editor/import_dock.cpp +msgid "Reimport" +msgstr "Reimportar" + +#: editor/import_dock.cpp +msgid "Save Scenes, Re-Import, and Restart" +msgstr "" + +#: editor/import_dock.cpp +msgid "Changing the type of an imported file requires editor restart." +msgstr "" + +#: editor/import_dock.cpp +msgid "" +"WARNING: Assets exist that use this resource, they may stop loading properly." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Failed to load resource." +msgstr "Fallou a carga do Recurso." + +#: editor/inspector_dock.cpp +msgid "Expand All Properties" +msgstr "Expandir Tódalas Propiedades" + +#: editor/inspector_dock.cpp +msgid "Collapse All Properties" +msgstr "Colapsar Tódalas Propiedades" + +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +msgid "Save As..." +msgstr "Gardar Como..." + +#: editor/inspector_dock.cpp +msgid "Copy Params" +msgstr "Copiar Parámetros" + +#: editor/inspector_dock.cpp +msgid "Edit Resource Clipboard" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Copy Resource" +msgstr "Copiar Recurso" + +#: editor/inspector_dock.cpp +msgid "Make Built-In" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Make Sub-Resources Unique" +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Open in Help" +msgstr "Abrir na Axuda" + +#: editor/inspector_dock.cpp +msgid "Create a new resource in memory and edit it." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Load an existing resource from disk and edit it." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Save the currently edited resource." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Go to the previous edited object in history." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Go to the next edited object in history." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "History of recently edited objects." +msgstr "" + +#: editor/inspector_dock.cpp +msgid "Object properties." +msgstr "Propiedade de Obxectos." + +#: editor/inspector_dock.cpp +msgid "Filter properties" +msgstr "Filtrar propiedades" + +#: editor/inspector_dock.cpp +msgid "Changes may be lost!" +msgstr "Os cambios poderían perderse!" + +#: editor/multi_node_edit.cpp +msgid "MultiNode Set" +msgstr "" + +#: editor/node_dock.cpp +msgid "Select a single node to edit its signals and groups." +msgstr "Seleccione un nodo para editar as súas sinais e grupos." + +#: editor/plugin_config_dialog.cpp +msgid "Edit a Plugin" +msgstr "Editar unha Característica Adicional (Plugin)" + +#: editor/plugin_config_dialog.cpp +msgid "Create a Plugin" +msgstr "Crear unha Característica Adicional (Plugin)" + +#: editor/plugin_config_dialog.cpp +msgid "Plugin Name:" +msgstr "Nome do Plugin:" + +#: editor/plugin_config_dialog.cpp +msgid "Subfolder:" +msgstr "Subcartafol:" + +#: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp +msgid "Language:" +msgstr "Linguaxe:" + +#: editor/plugin_config_dialog.cpp +msgid "Script Name:" +msgstr "Nome do Script:" + +#: editor/plugin_config_dialog.cpp +msgid "Activate now?" +msgstr "Activar agora?" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create Polygon" +msgstr "Crear Polígono" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Create points." +msgstr "Crear puntos." + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "" +"Edit points.\n" +"LMB: Move Point\n" +"RMB: Erase Point" +msgstr "" +"Editar puntos.\n" +"Clic Izq: Mover Punto\n" +"Clic Der: Eliminar Punto" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +#: editor/plugins/animation_blend_space_1d_editor.cpp +msgid "Erase points." +msgstr "Borrar puntos." + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Edit Polygon" +msgstr "Editar Polígono" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Insert Point" +msgstr "Inserir Punto" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Edit Polygon (Remove Point)" +msgstr "Editar Polígono (Eliminar Punto)" + +#: editor/plugins/abstract_polygon_2d_editor.cpp +msgid "Remove Polygon And Point" +msgstr "Eliminar Polígono e Punto" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Animation" +msgstr "Engadir Animación" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Load..." +msgstr "Cargar..." + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Move Node Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +msgid "Change BlendSpace1D Limits" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +msgid "Change BlendSpace1D Labels" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_state_machine_editor.cpp +msgid "This type of node can't be used. Only root nodes are allowed." +msgstr "Non se pode usar este tipo de nodo. Só nodos raíz están permitidos." + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Add Node Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Add Animation Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +msgid "Remove BlendSpace1D Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +msgid "Move BlendSpace1D Node Point" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +msgid "" +"AnimationTree is inactive.\n" +"Activate to enable playback, check node warnings if activation fails." +msgstr "" +"O AnimationTree está inactivo.\n" +"Actívao para permitir a reprodución; e comproba os avisos do nodo se hai un " +"erro na activación." + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Set the blending position within the space" +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Select and move points, create points with RMB." +msgstr "" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp +msgid "Enable snap and show grid." +msgstr "Activar axuste de cuadrícula e amosar cuadrícula." + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Point" +msgstr "Punto" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Open Editor" +msgstr "Abrir Editor" + +#: editor/plugins/animation_blend_space_1d_editor.cpp +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Open Animation Node" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Triangle already exists." +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Add Triangle" +msgstr "Engadir Triángulo" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Change BlendSpace2D Limits" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Change BlendSpace2D Labels" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Remove BlendSpace2D Point" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Remove BlendSpace2D Triangle" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "BlendSpace2D does not belong to an AnimationTree node." +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "No triangles exist, so no blending can take place." +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Toggle Auto Triangles" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Create triangles by connecting points." +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Erase points and triangles." +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +msgid "Generate blend triangles automatically (instead of manually)" +msgstr "" + +#: editor/plugins/animation_blend_space_2d_editor.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend:" +msgstr "Mezcla:" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Parameter Changed" +msgstr "Parámetro Cambiado" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Edit Filters" +msgstr "Editar Flitros" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Output node can't be added to the blend tree." +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Add Node to BlendTree" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Node Moved" +msgstr "Nodo Movido" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Unable to connect, port may be in use or connection may be invalid." +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Nodes Connected" +msgstr "Nodos Conectado" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Nodes Disconnected" +msgstr "Nodos Desconectados" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Set Animation" +msgstr "Establecer Animación" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Delete Node" +msgstr "Eliminar Nodo" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "Eliminar Nodo(s)" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Toggle Filter On/Off" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Change Filter" +msgstr "Cambiar Filtro" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "No animation player set, so unable to retrieve track names." +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Player path set is invalid, so unable to retrieve track names." +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/root_motion_editor_plugin.cpp +msgid "" +"Animation player has no valid root node path, so unable to retrieve track " +"names." +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Anim Clips" +msgstr "Clips de Animación" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Audio Clips" +msgstr "Clips de Audio" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Functions" +msgstr "Funcións" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Node Renamed" +msgstr "Nodo Renomeado" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Add Node..." +msgstr "Engadir Nodo..." + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +#: editor/plugins/root_motion_editor_plugin.cpp +msgid "Edit Filtered Tracks:" +msgstr "" + +#: editor/plugins/animation_blend_tree_editor_plugin.cpp +msgid "Enable Filtering" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Toggle Autoplay" +msgstr "Act./Desact. Auto-reproducción" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Anim" +msgstr "Nova Animación" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Delete Animation?" +msgstr "Eliminar Animación?" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Remove Animation" +msgstr "Eliminar Animación" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Invalid animation name!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation name already exists!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Renomear Animación" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Next Changed" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Blend Time" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load Animation" +msgstr "Cargar Animación" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Duplicar Animación" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "No animation to copy!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "No animation resource on clipboard!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Pasted Animation" +msgstr "Animación Pegada" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Paste Animation" +msgstr "Pegar Animación" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "No animation to edit!" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from current pos. (A)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from end. (Shift+A)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Stop animation playback. (S)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from start. (Shift+D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from current pos. (D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation position (in seconds)." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Scale animation playback globally for the node." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Tools" +msgstr "Ferramentas de Animación" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation" +msgstr "Animación" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Edit Transitions..." +msgstr "Editar Transicións..." + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Open in Inspector" +msgstr "Abrir no Inspector" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Display list of animations in player." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Autoplay on Load" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Enable Onion Skinning" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Onion Skinning Options" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Directions" +msgstr "Direccións" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Past" +msgstr "Pasado" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Future" +msgstr "Futuro" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Depth" +msgstr "Profundidad" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "1 step" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "2 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "3 steps" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Differences Only" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Force White Modulate" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Include Gizmos (3D)" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Pin AnimationPlayer" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Name:" +msgstr "Nome da Animación:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +msgid "Error!" +msgstr "Erro!" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Times:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Next (Auto Queue):" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Cross-Animation Blend Times" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Move Node" +msgstr "Mover Nodo" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Transition exists!" +msgstr "Existe transición!" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Add Transition" +msgstr "Engadir Transición" + +#: editor/plugins/animation_state_machine_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node" +msgstr "Engadir Nodo" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "End" +msgstr "Fin" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Immediate" +msgstr "Inmediata" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Sync" +msgstr "Sincronizar" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "At End" +msgstr "Ao Final" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Travel" +msgstr "Viaxe" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Start and end nodes are needed for a sub-transition." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "No playback resource set at path: %s." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Node Removed" +msgstr "Nodo Eliminado" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Transition Removed" +msgstr "Transición Eliminada" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Set Start Node (Autoplay)" +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "" +"Select and move nodes.\n" +"RMB to add new nodes.\n" +"Shift+LMB to create connections." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Create new nodes." +msgstr "Crear novos nodos." + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Connect nodes." +msgstr "Conectar nodos." + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Remove selected node or transition." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Toggle autoplay this animation on start, restart or seek to zero." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Set the end animation. This is useful for sub-transitions." +msgstr "" + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Transition: " +msgstr "Transición: " + +#: editor/plugins/animation_state_machine_editor.cpp +msgid "Play Mode:" +msgstr "Modo de Reprodución:" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "AnimationTree" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "New name:" +msgstr "Novo nome:" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Scale:" +msgstr "Escala:" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Fade In (s):" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Fade Out (s):" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend" +msgstr "Mezcla" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Mix" +msgstr "Mezcla" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Auto Restart:" +msgstr "Auto Reinicio:" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Restart (s):" +msgstr "Reiniciar (s):" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Random Restart (s):" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Start!" +msgstr "Comezar!" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Amount:" +msgstr "Cantidade:" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend 0:" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend 1:" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "X-Fade Time (s):" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Current:" +msgstr "Actual:" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Input" +msgstr "Engadir Entrada" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Clear Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Set Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Delete Input" +msgstr "Eliminar Entrada" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Animation tree is valid." +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Animation tree is invalid." +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Animation Node" +msgstr "Nodo de Animación" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "OneShot Node" +msgstr "Nodo de Execución Única (Oneshot)" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Mix Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend2 Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend3 Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Blend4 Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "TimeScale Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "TimeSeek Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Transition Node" +msgstr "" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Import Animations..." +msgstr "Importar Animacións..." + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Edit Node Filters" +msgstr "Editar Filtros do Nodo" + +#: editor/plugins/animation_tree_player_editor_plugin.cpp +msgid "Filters..." +msgstr "Filtros..." + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Contents:" +msgstr "Contidos:" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "View Files" +msgstr "Ver Arquivos" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Connection error, please try again." +msgstr "Houbo un erro na conexión; por favor, inténtao de novo." + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't connect to host:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No response from host:" +msgstr "Non houbo respota por parte do host:" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Can't resolve hostname:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, return code:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed." +msgstr "A petición fallou." + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Cannot save response to:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Write error." +msgstr "Erro de escritura." + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, too many redirects" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Redirect loop." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Request failed, timeout" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Timeout." +msgstr "Timeout." + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Bad download hash, assuming file has been tampered with." +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Expected:" +msgstr "Esperado:" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Got:" +msgstr "Recibido:" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Failed SHA-256 hash check" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Asset Download Error:" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Downloading (%s / %s)..." +msgstr "Descargando (%s / %s)..." + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Downloading..." +msgstr "Descargando..." + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Resolving..." +msgstr "Resolvendo..." + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Error making request" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Idle" +msgstr "Ocioso" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Install..." +msgstr "Instalar..." + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Retry" +msgstr "Reintentar" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download Error" +msgstr "Erro na Descarga" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Download for this asset is already in progress!" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Recently Updated" +msgstr "Actualizado Recentemente" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Least Recently Updated" +msgstr "" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Name (A-Z)" +msgstr "Nome (A-Z)" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Name (Z-A)" +msgstr "Nome (Z-A)" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "License (A-Z)" +msgstr "Licenza (A-Z)" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "License (Z-A)" +msgstr "Licenza (Z-A)" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "First" +msgstr "Primeiro" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Previous" +msgstr "Anterior" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Next" +msgstr "Seguinte" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Last" +msgstr "Derradeiro" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "All" +msgstr "Todos" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "No results for \"%s\"." +msgstr "Non houbo resultado para \"%s\"." + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Import..." +msgstr "Importar..." + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Plugins..." +msgstr "Características Adicionais (Plugins)..." + +#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp +msgid "Sort:" +msgstr "Ordenar:" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Category:" +msgstr "Categoría:" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Site:" +msgstr "Sitio:" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Support" +msgstr "Soporte" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Official" +msgstr "Oficial" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Testing" +msgstr "Probas" + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Loading..." +msgstr "Cargando..." + +#: editor/plugins/asset_library_editor_plugin.cpp +msgid "Assets ZIP File" +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "" +"Can't determine a save path for lightmap images.\n" +"Save your scene and try again." +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "" +"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake " +"Light' flag is on." +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "Failed creating lightmap images, make sure path is writable." +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "Failed determining lightmap size. Maximum lightmap size too small?" +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "" +"Some mesh is invalid. Make sure the UV2 channel values are contained within " +"the [0.0,1.0] square region." +msgstr "" +"Algunha malla é inválida. Asegúrese de que o os valores do canle UV2 están " +"contidos dentro da rexión cadrada ([0.0,1.0], [0.0,1.0])." + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "" +"Godot editor was built without ray tracing support, lightmaps can't be baked." +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "Bake Lightmaps" +msgstr "" + +#: editor/plugins/baked_lightmap_editor_plugin.cpp +msgid "Select lightmap bake file:" +msgstr "" + +#: editor/plugins/camera_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Preview" +msgstr "Vista Previa" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Configure Snap" +msgstr "Configurar Axuste de Cuadrícula" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Grid Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Grid Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Primary Line Every:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "steps" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Vertical Guide" +msgstr "Mover Guía Vertical" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create Vertical Guide" +msgstr "Crear Guía Vertical" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Remove Vertical Guide" +msgstr "Eliminar Guía Vertical" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Horizontal Guide" +msgstr "Mover Guía Horizontal" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create Horizontal Guide" +msgstr "Crear Guía Horizontal" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Remove Horizontal Guide" +msgstr "Eliminar Guía Horizontal" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create Horizontal and Vertical Guides" +msgstr "Crear Guías Horizontais e Verticais" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Set CanvasItem \"%s\" Pivot Offset to (%d, %d)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotate %d CanvasItems" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotate CanvasItem \"%s\" to %d degrees" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move CanvasItem \"%s\" Anchor" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale Node2D \"%s\" to (%s, %s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Resize Control \"%s\" to (%d, %d)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale %d CanvasItems" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale CanvasItem \"%s\" to (%s, %s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move %d CanvasItems" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move CanvasItem \"%s\" to (%d, %d)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Children of containers have their anchors and margins values overridden by " +"their parent." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Presets for the anchors and margins values of a Control node." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"When active, moving Control nodes changes their anchors instead of their " +"margins." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Top Left" +msgstr "Arriba á Esquerda" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Top Right" +msgstr "Arriba á Dereita" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Bottom Right" +msgstr "Abaixo á Dereita" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Bottom Left" +msgstr "Abaixo á Esquerda" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Left" +msgstr "Centro á Esquerda" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Top" +msgstr "Centro Arriba" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Right" +msgstr "Centro á Dereita" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Bottom" +msgstr "Centro Abaixo" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center" +msgstr "Centro" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Left Wide" +msgstr "Esquerdo Alto" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Top Wide" +msgstr "Arriba Ancho" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Right Wide" +msgstr "Dereito Alto" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Bottom Wide" +msgstr "Abaixo Ancho" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "VCenter Wide" +msgstr "CentradoV Alto" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "HCenter Wide" +msgstr "CentradoH Ancho" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Full Rect" +msgstr "Recta Completa" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Keep Ratio" +msgstr "Manter Relación de Aspecto" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Anchors only" +msgstr "Só Áncoras" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors and Margins" +msgstr "Cambiar Áncoras e Marxes" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors" +msgstr "Cambiar Áncoras" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"Overrides game camera with editor viewport camera." +msgstr "" +"Substituír a Cámara do Xogo\n" +"Substitue a cámara do xogo pola cámara da Mini-ventá (Viewport) do editor." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Game Camera Override\n" +"No game instance running." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Lock Selected" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Unlock Selected" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Group Selected" +msgstr "Agrupar Selección" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Ungroup Selected" +msgstr "Desagrupar Selección" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Paste Pose" +msgstr "Pegar Pose" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Guides" +msgstr "Limpar Guías" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Create Custom Bone(s) from Node(s)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Bones" +msgstr "Limpar Ósos" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Warning: Children of a container get their position and size determined only " +"by their parent." +msgstr "" +"Aviso: Os nodos fillos dun contedor (Container) teñen determinada a súa " +"posición e tamaño unicamente polo seu padre." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/texture_region_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp +msgid "Zoom Reset" +msgstr "Restablecer Zoom" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Select Mode" +msgstr "Elixir Modo" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Drag: Rotate" +msgstr "Arrastrar: Rotar" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+Drag: Move" +msgstr "Alt+Arrastrar: Mover" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+RMB: Depth list selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Move Mode" +msgstr "Mover Modo" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Mode" +msgstr "Modo Rotación" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Mode" +msgstr "Modo Escalado" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Show a list of all objects at the position clicked\n" +"(same as Alt+RMB in select mode)." +msgstr "" +"Amosa unha lista de obxectos na posición na que se fixo clic\n" +"(O mesmo que usar Alt+Clic Dereito en modo selección)." + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Click to change object's rotation pivot." +msgstr "Faga clic para cambiar o pivote de rotación do obxecto." + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Pan Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Ruler Mode" +msgstr "Modo Regra" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Toggle smart snapping." +msgstr "Act./Desact. axuste intelixente." + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Smart Snap" +msgstr "Usar Axuste Intelixente" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Toggle grid snapping." +msgstr "Act./Desact. axuste de cuadrícula." + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Grid Snap" +msgstr "Usar Axuste de Cuadrícula" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snapping Options" +msgstr "Opcións de Axuste de Cuadrícula" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Rotation Snap" +msgstr "Empregar Axuste de Rotación" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Scale Snap" +msgstr "Empregar Axuste de Escalado" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap Relative" +msgstr "Axuste Relativo" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Pixel Snap" +msgstr "Empregar Axuste aos Píxeles" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Smart Snapping" +msgstr "Axuste Intelixente" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Configure Snap..." +msgstr "Configurar Axuste de Cuadrícula..." + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Parent" +msgstr "Axustar ao Pai" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Node Anchor" +msgstr "Axustar á Áncora do Nodo" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Node Sides" +msgstr "Axustar aos Laterais do Nodo" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Node Center" +msgstr "Axustar ao Centro do Nodo" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Other Nodes" +msgstr "Axustar a Outros Nodos" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap to Guides" +msgstr "Axustar as Guías" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Lock the selected object in place (can't be moved)." +msgstr "Fixar o obxecto no sitio (non se poderá mover)." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Unlock the selected object (can be moved)." +msgstr "Liberar o obxecto seleccionado (pode moverse)." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Makes sure the object's children are not selectable." +msgstr "Asegúrase de que os fillos do obxecto non sexan seleccionables." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Restores the object's children's ability to be selected." +msgstr "Volve a permitir seleccionar os fillos do obxecto." + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Skeleton Options" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Bones" +msgstr "Amosar Ósos" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make Custom Bone(s) from Node(s)" +msgstr "Crear Óso(s) Personalizados a partir de Nodo(s)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Custom Bones" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View" +msgstr "Ver" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Always Show Grid" +msgstr "Sempre Amosar a Cuadrícula" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Helpers" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Rulers" +msgstr "Amosar Regras" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Guides" +msgstr "Amosar Guías" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Origin" +msgstr "Amosar Orixe" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Viewport" +msgstr "Amosar Mini-Ventá (Viewport)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Group And Lock Icons" +msgstr "Amosar Grupo e Bloquear Iconas" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Selection" +msgstr "Centrar Selección" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Frame Selection" +msgstr "Encadrar Selección" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Preview Canvas Scale" +msgstr "Vista Previa da Escala do Lenzo (Canvas)" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Translation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Scale mask for inserting keys." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert keys (based on mask)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Auto insert keys when objects are translated, rotated or scaled (based on " +"mask).\n" +"Keys are only added to existing tracks, no new tracks will be created.\n" +"Keys must be inserted manually for the first time." +msgstr "" +"Inserción automática de claves cando os obxectos son trasladados, rotados, " +"ou escalados (depenendo da Máscara).\n" +"As chaves só engádense a pistas xa existentes; nunca se crean novas pistas.\n" +"As chaves teñen que insertarse manualmente cando se utiliza por primeira vez." + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Auto Insert Key" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Animation Key and Pose Options" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key (Existing Tracks)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Copy Pose" +msgstr "Copiar Pose" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Pose" +msgstr "Restablecer Pose" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Multiply grid step by 2" +msgstr "Multiplicar Dimensión da Cuadrícula por 2" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Divide grid step by 2" +msgstr "Dividir Dimensión da Cuadrícula por 2" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Pan View" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Add %s" +msgstr "Engadir %s" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Adding %s..." +msgstr "Engadindo %s..." + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Cannot instantiate multiple nodes without root." +msgstr "Non se pode instanciar varios nodos sen un nodo raíz." + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Create Node" +msgstr "Crear Nodo" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Error instancing scene from %s" +msgstr "Erro instanciado escena desde %s" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Default Type" +msgstr "Cambiar Tipo por Defecto" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Drag & drop + Shift : Add node as sibling\n" +"Drag & drop + Alt : Change node type" +msgstr "" +"Arrastrar e Soltar + Shift : Engade nodo como irmán\n" +"Arrastrar e Soltar + Alt : Cambiar tipo de nodo" + +#: editor/plugins/collision_polygon_editor_plugin.cpp +msgid "Create Polygon3D" +msgstr "" + +#: editor/plugins/collision_polygon_editor_plugin.cpp +msgid "Edit Poly" +msgstr "Editar Polígono" + +#: editor/plugins/collision_polygon_editor_plugin.cpp +msgid "Edit Poly (Remove Point)" +msgstr "Editar Polígono (Eliminar Punto)" + +#: editor/plugins/collision_shape_2d_editor_plugin.cpp +msgid "Set Handle" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/cpu_particles_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Restart" +msgstr "Reiniciar" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Particles" +msgstr "Partículas" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "Número de Puntos Xerados:" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Solid Pixels" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Border Pixels" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Directed Border Pixels" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/cpu_particles_2d_editor_plugin.cpp +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + +#: editor/plugins/cpu_particles_editor_plugin.cpp +msgid "CPUParticles" +msgstr "CPUParticles" + +#: editor/plugins/cpu_particles_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Mesh" +msgstr "" + +#: editor/plugins/cpu_particles_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Node" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Flat 0" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Flat 1" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp +msgid "Ease In" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp +msgid "Ease Out" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Smoothstep" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve Tangent" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load Curve Preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Add Point" +msgstr "Engadir Punto" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove Point" +msgstr "Eliminar Punto" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Left Linear" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Right Linear" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load Preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove Curve Point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Toggle Curve Linear Tangent" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Hold Shift to edit tangents individually" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Right click to add point" +msgstr "" + +#: editor/plugins/gi_probe_editor_plugin.cpp +msgid "Bake GI Probe" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Gradient Edited" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item %d" +msgstr "Elemento %d" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Items" +msgstr "Elementos" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item List Editor" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create Occluder Polygon" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh is empty!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Couldn't create a Trimesh collision shape." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Static Trimesh Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "This doesn't work on scene root!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Static Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Can't create a single convex collision shape for the scene root." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Couldn't create a single convex collision shape." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Single Convex Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Can't create multiple convex collision shapes for the scene root." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Couldn't create any collision shapes." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Multiple Convex Shapes" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Navigation Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Contained Mesh is not of type ArrayMesh." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "UV Unwrap failed, mesh may not be manifold?" +msgstr "" +"Fallo no Unwrap de UV. Posiblemente a malla non é unha variedade (é dicir, " +"que a malla non forma unha superficie conexa, contínua, e con dous caras " +"diferenciables). En programas de modelaxe 3D pódese eliminar xeometría que " +"non sexa unha variedade (\"Non Manifold\") fácilmente." + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "No mesh to debug." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Model has no UV in this layer" +msgstr "O modelo non ten UVs nesta capa" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "MeshInstance lacks a Mesh!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh has not surface to create outlines from!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Could not create outline!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh" +msgstr "Malla" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Static Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a StaticBody and assigns a polygon-based collision shape to it " +"automatically.\n" +"This is the most accurate (but slowest) option for collision detection." +msgstr "" +"Crear un nodo StaticBody e asígnalle automáticamente unha forma física " +"baseada en polígonos.\n" +"Esta é a forma máis precisa (e máis lenta) de detección de colisións." + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a polygon-based collision shape.\n" +"This is the most accurate (but slowest) option for collision detection." +msgstr "" +"Crea unha formá física baseada en polígonos.\n" +"Esta é a forma máis precisa (pero máis lenta) de detectar colisións." + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Single Convex Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a single convex collision shape.\n" +"This is the fastest (but least accurate) option for collision detection." +msgstr "" +"Crea unha única forma física convexa.\n" +"Esta é a maneira más eficiente (pero menos precisa) de detectar colisións." + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Multiple Convex Collision Siblings" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a polygon-based collision shape.\n" +"This is a performance middle-ground between the two above options." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh..." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "" +"Creates a static outline mesh. The outline mesh will have its normals " +"flipped automatically.\n" +"This can be used instead of the SpatialMaterial Grow property when using " +"that property isn't possible." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "View UV1" +msgstr "Amosar UV1" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "View UV2" +msgstr "Amosar UV2" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Unwrap UV2 for Lightmap/AO" +msgstr "Facer Unwrap do UV2 para Lightmap/AO" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Outline Size:" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "UV Channel Debug" +msgstr "Depuración do Canle UV" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Remove item %d?" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "" +"Update from existing scene?:\n" +"%s" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Mesh Library" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Item" +msgstr "Engadir Elemento" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Remove Selected Item" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Import from Scene" +msgstr "" + +#: editor/plugins/mesh_library_editor_plugin.cpp +msgid "Update from Scene" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and no MultiMesh set in node)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and MultiMesh contains no Mesh)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (not a MeshInstance)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (contains no Mesh resource)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No surface source specified." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no geometry)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no faces)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate Surface" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate MultiMesh" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "X-Axis" +msgstr "Eixe X" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Y-Axis" +msgstr "Eixe Y" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Z-Axis" +msgstr "Eixe Z" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh Up Axis:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Rotation:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Tilt:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Scale:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate" +msgstr "Encher" + +#: editor/plugins/navigation_polygon_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create Navigation Polygon" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Convert to CPUParticles" +msgstr "Converter a CPUParticles" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generating Visibility Rect" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generate Visibility Rect" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Convert to CPUParticles2D" +msgstr "Converter a CPUParticles2D" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "The geometry's faces don't contain any area." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "The geometry doesn't contain any faces." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "\"%s\" doesn't inherit from Spatial." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "\"%s\" doesn't contain geometry." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "\"%s\" doesn't contain face geometry." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emitter" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Points:" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points+Normal (Directed)" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Volume" +msgstr "Volume" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Source: " +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "A processor material of type 'ParticlesMaterial' is required." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generate Visibility AABB" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point to Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Split Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Point in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move In-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Out-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Select Points" +msgstr "Seleccionar Puntos" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Shift+Drag: Select Control Points" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Click: Add Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Left Click: Split Segment (in curve)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Right Click: Delete Point" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Select Control Points (Shift+Drag)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point (in empty space)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Delete Point" +msgstr "Eliminar Puntos" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Close Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp editor/plugins/theme_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_export.cpp +msgid "Options" +msgstr "Opcións" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Mirror Handle Angles" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Mirror Handle Lengths" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Curve Point #" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Point Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve In Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Out Position" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Path" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Path Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Out-Control Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Segment (in curve)" +msgstr "" + +#: editor/plugins/physical_bone_plugin.cpp +msgid "Move Joint" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "" +"The skeleton property of the Polygon2D does not point to a Skeleton2D node" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Sync Bones" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "" +"No texture in this polygon.\n" +"Set a texture to be able to edit UV." +msgstr "" +"Non hai unha textura neste polígono.\n" +"Engada unha textura para editar o UV." + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create UV Map" +msgstr "Crear Mapa UV" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "" +"Polygon 2D has internal vertices, so it can no longer be edited in the " +"viewport." +msgstr "" +"O polígono 2D ten vértices internos, polo que xa non se pode editar na Mini-" +"Ventá (Viewport)." + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create Polygon & UV" +msgstr "Crear Polígono e UV" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create Internal Vertex" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Remove Internal Vertex" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Invalid Polygon (need 3 different vertices)" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Add Custom Polygon" +msgstr "Engadir Polígono Personalizado" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Remove Custom Polygon" +msgstr "Eliminar Polígono Personalizado" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Transform UV Map" +msgstr "Transformar Mapa UV" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Transform Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Paint Bone Weights" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Open Polygon 2D UV editor." +msgstr "Abrir Editor UV de Polígonos 2D." + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygon 2D UV Editor" +msgstr "Editor UV de Polígonos 2D" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "UV" +msgstr "UV" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Points" +msgstr "Puntos" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygons" +msgstr "Polígonos" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Bones" +msgstr "Ósos" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Points" +msgstr "Mover Puntos" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Command: Rotate" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift: Move All" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift+Command: Scale" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Ctrl: Rotate" +msgstr "Ctrl: Rotar" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift+Ctrl: Scale" +msgstr "Shift+Ctrl: Escalar" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Polygon" +msgstr "Mover Polígono" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Rotate Polygon" +msgstr "Rotar Polígono" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Scale Polygon" +msgstr "Escalar Polígono" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create a custom polygon. Enables custom polygon rendering." +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "" +"Remove a custom polygon. If none remain, custom polygon rendering is " +"disabled." +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Paint weights with specified intensity." +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Unpaint weights with specified intensity." +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Radius:" +msgstr "Radio:" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Copy Polygon to UV" +msgstr "Copiar Polígono a UV" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Copy UV to Polygon" +msgstr "Copiar UV a Polígono" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Clear UV" +msgstr "Limpar UV" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Settings" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Snap" +msgstr "Axuste de Cuadrícula" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Enable Snap" +msgstr "Activar Axuste" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid" +msgstr "Cuadrícula" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Show Grid" +msgstr "Amosar Cuadrícula" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Configure Grid:" +msgstr "Configurar Cuadrícula:" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Offset X:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Offset Y:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Step X:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Step Y:" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Sync Bones to Polygon" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "ERROR: Couldn't load resource!" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Add Resource" +msgstr "Engadir Recurso" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Rename Resource" +msgstr "Renomear Recurso" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Delete Resource" +msgstr "Eliminar Recurso" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Resource clipboard is empty!" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Paste Resource" +msgstr "Pegar Recurso" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/scene_tree_editor.cpp +msgid "Instance:" +msgstr "Instancia:" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp +#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Type:" +msgstr "Tipo:" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp +msgid "Open in Editor" +msgstr "" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Load Resource" +msgstr "Cargar Recurso" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "ResourcePreloader" +msgstr "" + +#: editor/plugins/root_motion_editor_plugin.cpp +msgid "AnimationTree has no path set to an AnimationPlayer" +msgstr "" + +#: editor/plugins/root_motion_editor_plugin.cpp +msgid "Path to AnimationPlayer is invalid" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close and save changes?" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error writing TextFile:" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Could not load file at:" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error saving file!" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error while saving theme." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error Saving" +msgstr "Erro ao Gardar" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error importing theme." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error Importing" +msgstr "Erro ao Importar" + +#: editor/plugins/script_editor_plugin.cpp +msgid "New Text File..." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open File" +msgstr "Abrir Arquivo" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save File As..." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Can't obtain the script for running." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Script failed reloading, check console for errors." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Script is not in tool mode, will not be able to run." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"To run this script, it must inherit EditorScript and be set to tool mode." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Import Theme" +msgstr "Importar Tema" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error while saving theme" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error saving" +msgstr "Erro ao gardar" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme As..." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "%s Class Reference" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find Next" +msgstr "Atopar Seguinte" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +msgid "Find Previous" +msgstr "Atopar Anterior" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Filter scripts" +msgstr "Filtrar scripts" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Toggle alphabetical sorting of the method list." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Filter methods" +msgstr "Filtrar métodos" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Sort" +msgstr "Ordenar" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Move Up" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Move Down" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Next script" +msgstr "Seguinte script" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Previous script" +msgstr "Anterior script" + +#: editor/plugins/script_editor_plugin.cpp +msgid "File" +msgstr "Arquivo" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open..." +msgstr "Abrir..." + +#: editor/plugins/script_editor_plugin.cpp +msgid "Reopen Closed Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save All" +msgstr "Gardar Todo" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Soft Reload Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Copy Script Path" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Previous" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Next" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp +msgid "Theme" +msgstr "Tema" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Import Theme..." +msgstr "Importar Tema..." + +#: editor/plugins/script_editor_plugin.cpp +msgid "Reload Theme" +msgstr "Volver a Cargar Tema" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme" +msgstr "Gardar Tema" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close All" +msgstr "Pechar Todo" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close Docs" +msgstr "Pechar Documentación" + +#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp +msgid "Run" +msgstr "Executar" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Buscar" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Into" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Over" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Break" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp +#: editor/script_editor_debugger.cpp +msgid "Continue" +msgstr "Continuar" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Keep Debugger Open" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Debug with External Editor" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open Godot online documentation." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search the reference documentation." +msgstr "Buscar na documentación de referencia." + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to previous edited document." +msgstr "Ir ao anterior documento editado." + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to next edited document." +msgstr "Ir ao seguinte documento editado." + +#: editor/plugins/script_editor_plugin.cpp +msgid "Discard" +msgstr "Descartar" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?:" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Debugger" +msgstr "Depurador" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search Results" +msgstr "Resultados de Búsqueda" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Scripts" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Connections to method:" +msgstr "" + +#: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp +msgid "Source" +msgstr "Fonte" + +#: editor/plugins/script_text_editor.cpp +msgid "Target" +msgstr "Obxectivo" + +#: editor/plugins/script_text_editor.cpp +msgid "" +"Missing connected method '%s' for signal '%s' from node '%s' to node '%s'." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "[Ignore]" +msgstr "[Ignorar]" + +#: editor/plugins/script_text_editor.cpp +msgid "Line" +msgstr "Liña" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Function" +msgstr "Ir a Función" + +#: editor/plugins/script_text_editor.cpp +msgid "Only resources from filesystem can be dropped." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't drop nodes because script '%s' is not used in this scene." +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lookup Symbol" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Pick Color" +msgstr "Elexir Cor" + +#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp +msgid "Convert Case" +msgstr "Converter Maiús./Minús." + +#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp +msgid "Uppercase" +msgstr "Maiúscula" + +#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp +msgid "Lowercase" +msgstr "Minúscula" + +#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp +msgid "Capitalize" +msgstr "Capitalizar" + +#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp +msgid "Syntax Highlighter" +msgstr "Marcador de Sintaxe" + +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +msgid "Bookmarks" +msgstr "Marcadores" + +#: editor/plugins/script_text_editor.cpp +msgid "Breakpoints" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +msgid "Go To" +msgstr "Ir a" + +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Cut" +msgstr "Cortar" + +#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp +msgid "Select All" +msgstr "Seleccionar Todo" + +#: editor/plugins/script_text_editor.cpp +msgid "Delete Line" +msgstr "Eliminar Liña" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Left" +msgstr "Sangrado á Esquerda" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Right" +msgstr "Sangrado á Dereita" + +#: editor/plugins/script_text_editor.cpp +msgid "Toggle Comment" +msgstr "Comentar/Descomentar" + +#: editor/plugins/script_text_editor.cpp +msgid "Fold/Unfold Line" +msgstr "Expandir/Colapsar Liña" + +#: editor/plugins/script_text_editor.cpp +msgid "Fold All Lines" +msgstr "Colapsar Tódalas Liñas" + +#: editor/plugins/script_text_editor.cpp +msgid "Unfold All Lines" +msgstr "Expandir Tódalas Liñas" + +#: editor/plugins/script_text_editor.cpp +msgid "Clone Down" +msgstr "Clonar Liña" + +#: editor/plugins/script_text_editor.cpp +msgid "Complete Symbol" +msgstr "Completar Símbolo" + +#: editor/plugins/script_text_editor.cpp +msgid "Evaluate Selection" +msgstr "Evaluar Selección" + +#: editor/plugins/script_text_editor.cpp +msgid "Trim Trailing Whitespace" +msgstr "Eliminar Espazos ao Final da Liña" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent to Spaces" +msgstr "Convertir Indentación a Espazos" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent to Tabs" +msgstr "Convertir Identación a Tabulacións" + +#: editor/plugins/script_text_editor.cpp +msgid "Auto Indent" +msgstr "Auto Indentar" + +#: editor/plugins/script_text_editor.cpp +msgid "Find in Files..." +msgstr "Buscar en Arquivos.." + +#: editor/plugins/script_text_editor.cpp +msgid "Contextual Help" +msgstr "Axuda Contextual" + +#: editor/plugins/script_text_editor.cpp +msgid "Toggle Bookmark" +msgstr "Act./Desact. Marcapáxinas" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Next Bookmark" +msgstr "Ir ao Seguinte Marcapáxinas" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Previous Bookmark" +msgstr "Ir ao Anterior Marcapáxinas" + +#: editor/plugins/script_text_editor.cpp +msgid "Remove All Bookmarks" +msgstr "Eliminar Tódolos Marcapáxinas" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Function..." +msgstr "Ir a Función..." + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Line..." +msgstr "Ir a Liña..." + +#: editor/plugins/script_text_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Toggle Breakpoint" +msgstr "Act./Desact. Punto de Interrupción (Breakpoint)" + +#: editor/plugins/script_text_editor.cpp +msgid "Remove All Breakpoints" +msgstr "Eliminar Tódolos Puntos de Interrupción (Breakpoints)" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Next Breakpoint" +msgstr "Ir ao Seguinte Punto de Interrupción" + +#: editor/plugins/script_text_editor.cpp +msgid "Go to Previous Breakpoint" +msgstr "Ir ao Anterior Punto de Interrupción" + +#: editor/plugins/shader_editor_plugin.cpp +msgid "" +"This shader has been modified on on disk.\n" +"What action should be taken?" +msgstr "" +"Este shader foi modificado en disco.\n" +"Que acción deberían de tomarse?" + +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "Shader" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "This skeleton has no bones, create some children Bone2D nodes." +msgstr "Este esqueleto non ten ósos; crea uns nodos fillo Bone2D." + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Create Rest Pose from Bones" +msgstr "Crear Pose de Repouso a partir dos Ósos" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Set Rest Pose to Bones" +msgstr "Asignar Pose de Repouso aos Ósos" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Skeleton2D" +msgstr "Skeleton2D" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Make Rest Pose (From Bones)" +msgstr "Crear Pose de Repouso (a partir dos Ósos)" + +#: editor/plugins/skeleton_2d_editor_plugin.cpp +msgid "Set Bones to Rest Pose" +msgstr "Asignar Pose de Repouso aos Ósos" + +#: editor/plugins/skeleton_editor_plugin.cpp +msgid "Create physical bones" +msgstr "Crear ósos físicos" + +#: editor/plugins/skeleton_editor_plugin.cpp +msgid "Skeleton" +msgstr "Esqueleto" + +#: editor/plugins/skeleton_editor_plugin.cpp +msgid "Create physical skeleton" +msgstr "Crear esqueleto físico" + +#: editor/plugins/skeleton_ik_editor_plugin.cpp +msgid "Play IK" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orthogonal" +msgstr "Ortogonal" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective" +msgstr "Perspetiva" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Aborted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "X-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Y-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Z-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Plane Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scaling: " +msgstr "Escalado: " + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translating: " +msgstr "Trasladando: " + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotating %s degrees." +msgstr "Rotando % graos." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Keying is disabled (no key inserted)." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Animation Key Inserted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Pitch" +msgstr "Cabeceo" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Yaw" +msgstr "Guiñada" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "Tamaño" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "Obxectos Debuxados" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Shader Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "Vértices" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top View." +msgstr "Vista Superior." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View." +msgstr "Vista Inferior." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom" +msgstr "Inferior" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left View." +msgstr "Vista Esquerda." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left" +msgstr "Esquerda" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right View." +msgstr "Vista Dereita." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right" +msgstr "Dereita" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front View." +msgstr "Vista Frontal." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front" +msgstr "Frontal" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View." +msgstr "Vista Traseria." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear" +msgstr "Traseira" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Transform with View" +msgstr "Aliñar Transformación con Perspectiva" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Rotation with View" +msgstr "Aliñar Rotación con Perspectiva" + +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "No parent to instance a child at." +msgstr "Non hai un pai ao que instanciarlle un fillo." + +#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "This operation requires a single selected node." +msgstr "Esta operación precisa un único nodo seleccionado." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "Auto Ortogonal Activado" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Lock View Rotation" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Normal" +msgstr "Mostrar de Forma Normal" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Wireframe" +msgstr "Mostrar Malla" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Overdraw" +msgstr "Mostrar Zonas Redebuxadas (Overdraw)" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Unshaded" +msgstr "Mostrar Sen Sombreado" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Environment" +msgstr "Amosar Entorno" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Gizmos" +msgstr "Amosar Gizmos" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Information" +msgstr "Amosar Información" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View FPS" +msgstr "Ver FPS" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Half Resolution" +msgstr "Resolución á Metade" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "Oínte de Son" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Enable Doppler" +msgstr "Activar Efecto Doppler" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Cinematic Preview" +msgstr "Vista Previa Cinemática" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Not available when using the GLES2 renderer." +msgstr "Non dispoñible cando se está usando o renderizador GLES2." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Slow Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." +msgstr "" +"Nota: o valor dos FPS corresponde aos fotogramas por segundo do editor.\n" +"Non pode usarse como unha forma fiable de medir o rendemento do xogo." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Click to toggle between visibility states.\n" +"\n" +"Open eye: Gizmo is visible.\n" +"Closed eye: Gizmo is hidden.\n" +"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")." +msgstr "" +"Faga clic para cambiar entre estados de visibilidade.\n" +"\n" +"Ollo aberto: Gizmo visible.\n" +"Ollo pechado: Gizmo oculto.\n" +"Ollo medio aberto, medio pechado: Gizmo visible ao través de superficies " +"opacas (\"raios x\")." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap Nodes To Floor" +msgstr "Axustar Nodos ao Chan" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Couldn't find a solid floor to snap the selection to." +msgstr "Non se puido encontrar chan sólido no que poder axustar a selección." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Drag: Rotate\n" +"Alt+Drag: Move\n" +"Alt+RMB: Depth list selection" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Use Local Space" +msgstr "Usar Espazo Local" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Use Snap" +msgstr "Usar Axuste de Cuadrícula" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View" +msgstr "Vista Inferior" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top View" +msgstr "Vista Superior" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View" +msgstr "Vista Traseira" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front View" +msgstr "Vista Frontal" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left View" +msgstr "Vista Esquerda" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right View" +msgstr "Vista Dereita" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Switch Perspective/Orthogonal View" +msgstr "Vista Perspectiva/Ortogonal" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Insert Animation Key" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Origin" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Selection" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Toggle Freelook" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Transform" +msgstr "Transformación" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap Object to Floor" +msgstr "Axustar Obxecto ao Chan" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog..." +msgstr "Aplicar Transformación..." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "1 Viewport" +msgstr "1 Ventá" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports" +msgstr "2 Ventás" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports (Alt)" +msgstr "2 Ventás (Alt)" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports" +msgstr "3 Ventás" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports (Alt)" +msgstr "3 Ventás (Alt)" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "4 Viewports" +msgstr "4 Ventás" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Gizmos" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Origin" +msgstr "Amosar Orixe" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Grid" +msgstr "Amosar Cuadrícula" + +#: editor/plugins/spatial_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Settings..." +msgstr "Axustes..." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap Settings" +msgstr "Configuración de Axuste" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate Snap:" +msgstr "Axuste de Translación:" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Snap (deg.):" +msgstr "Axuste de Rotación (graos):" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Snap (%):" +msgstr "Axuste de Escalado (%):" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Viewport Settings" +msgstr "Axustes de Visión" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective FOV (deg.):" +msgstr "Campo de Visión (graos):" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Near:" +msgstr "Plano Próximo:" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Far:" +msgstr "Plano Afastado:" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Change" +msgstr "Cambio de Transformación" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate:" +msgstr "Trasladar:" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate (deg.):" +msgstr "Rotar (graos):" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale (ratio):" +msgstr "Escalar (Razón):" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Type" +msgstr "Tipo de Transformación" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Pre" +msgstr "Anterior (Pre)" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Post" +msgstr "Posterior (Post)" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Nameless gizmo" +msgstr "Gizmo sen nome" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Mesh2D" +msgstr "Crear Mesh2D" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Mesh2D Preview" +msgstr "Vista Previa de Mesh2D" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create Polygon2D" +msgstr "Crear Polygon2D" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Polygon2D Preview" +msgstr "Vista Previa Polygon2D" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "CollisionPolygon2D Preview" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "LightOccluder2D Preview" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Sprite is empty!" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Can't convert a sprite using animation frames to mesh." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't replace by mesh." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Convert to Mesh2D" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Convert to Polygon2D" +msgstr "Convertir a Polygon2D" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create collision polygon." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create CollisionPolygon2D Sibling" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Invalid geometry, can't create light occluder." +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Create LightOccluder2D Sibling" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Sprite" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Simplification: " +msgstr "Simplificación: " + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Shrink (Pixels): " +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Grow (Pixels): " +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Update Preview" +msgstr "" + +#: editor/plugins/sprite_editor_plugin.cpp +msgid "Settings:" +msgstr "Axustes:" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "No Frames Selected" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add %d Frame(s)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Unable to load images" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "ERROR: Couldn't load frame resource!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Resource clipboard is empty or not a texture!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Paste Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Empty" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation FPS" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "(empty)" +msgstr "(baleiro)" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move Frame" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animations:" +msgstr "Animacións:" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "New Animation" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Speed:" +msgstr "Velocidade:" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Loop" +msgstr "Bucle" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animation Frames:" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add a Texture from File" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Frames from a Sprite Sheet" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (Before)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (After)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move (Before)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Move (After)" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Select Frames" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Horizontal:" +msgstr "Horizontal:" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Vertical:" +msgstr "Vertical:" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Select/Clear All Frames" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Create Frames from Sprite Sheet" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "SpriteFrames" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Set Region Rect" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Set Margin" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Snap Mode:" +msgstr "Modo de Axuste:" + +#: editor/plugins/texture_region_editor_plugin.cpp +#: scene/resources/visual_shader.cpp +msgid "None" +msgstr "Ningún" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Pixel Snap" +msgstr "Axustar aos Píxeles" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Grid Snap" +msgstr "Axuste de Cuadrícula" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Auto Slice" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Offset:" +msgstr "Offset:" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Step:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Sep.:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "TextureRegion" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add All Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add All" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove All Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +msgid "Remove All" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Edit Theme" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Theme editing menu." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Class Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Class Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create Empty Template" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create Empty Editor Template" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create From Current Editor Theme" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Toggle Button" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Disabled Button" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Disabled Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Check Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Checked Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Radio Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Checked Radio Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Named Sep." +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Submenu" +msgstr "Submenú" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Subitem 1" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Subitem 2" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Has" +msgstr "Ten" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Many" +msgstr "Moitas" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Disabled LineEdit" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 1" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 2" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 3" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Editable Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Subtree" +msgstr "Subárbore" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Has,Many,Options" +msgstr "Ten,Moitas,Opcións" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Data Type:" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Icon" +msgstr "Icona" + +#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp +msgid "Style" +msgstr "Estilo" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Font" +msgstr "Fonte" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Color" +msgstr "Cor" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Theme File" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase Selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Fix Invalid Tiles" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cut Selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Line Draw" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rectangle Paint" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Bucket Fill" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Find Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Transpose" +msgstr "Transpoñer" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Disable Autotile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Enable Priority" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Filter tiles" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Give a TileSet resource to this TileMap to use its tiles." +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "" +"Shift+LMB: Line Draw\n" +"Shift+Command+LMB: Rectangle Paint" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "" +"Shift+LMB: Line Draw\n" +"Shift+Ctrl+LMB: Rectangle Paint" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Pick Tile" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate Left" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate Right" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Flip Horizontally" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Flip Vertically" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Clear Transform" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Add Texture(s) to TileSet." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove selected Texture from TileSet." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from Scene" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from Scene" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "New Single Tile" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "New Autotile" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "New Atlas" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Next Coordinate" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Select the next shape, subtile, or Tile." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Previous Coordinate" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Select the previous shape, subtile, or Tile." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Region" +msgstr "Rexión" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Collision" +msgstr "Colisión" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Occlusion" +msgstr "Oclusión" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Navigation" +msgstr "Navegación" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Bitmask" +msgstr "Máscara de Bits" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Priority" +msgstr "Prioridade" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Z Index" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Region Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Collision Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Occlusion Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Navigation Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Bitmask Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Priority Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Icon Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Z Index Mode" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Copy bitmask." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Paste bitmask." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Erase bitmask." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create a new rectangle." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "New Rectangle" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create a new polygon." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "New Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Delete Selected Shape" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Keep polygon inside region Rect." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Enable snap and show grid (configurable via the Inspector)." +msgstr "" +"Activar axuste de cuadrícula e amosar cuadrícula (configurable no inspector)." + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Display Tile Names (Hold Alt Key)" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Add or select a texture on the left panel to edit the tiles bound to it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove selected texture? This will remove all tiles which use it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "You haven't selected a texture to remove." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from scene? This will overwrite all current tiles." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from scene?" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Texture" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "%s file(s) were not added because was already on the list." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Drag handles to edit Rect.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Delete selected Rect." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Select current edited sub-tile.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Delete polygon." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"LMB: Set bit on.\n" +"RMB: Set bit off.\n" +"Shift+LMB: Set wildcard bit.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Select sub-tile to use as icon, this will be also used on invalid autotile " +"bindings.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Select sub-tile to change its priority.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "" +"Select sub-tile to change its z index.\n" +"Click on another Tile to edit it." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Set Tile Region" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create Tile" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Set Tile Icon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Tile Bitmask" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Collision Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Occlusion Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Navigation Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Paste Tile Bitmask" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Clear Tile Bitmask" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Make Polygon Concave" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Make Polygon Convex" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Tile" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Collision Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Occlusion Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Navigation Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Tile Priority" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Edit Tile Z Index" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Make Convex" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Make Concave" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create Collision Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create Occlusion Polygon" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "This property can't be changed." +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "TileSet" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "No VCS addons are available." +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Error" +msgstr "Erro" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "No files added to stage" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Commit" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "VCS Addon is not initialized" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Version Control System" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Initialize" +msgstr "Inicializar" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Staging area" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Detect new changes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Changes" +msgstr "Cambios" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Modified" +msgstr "Modificado" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Renamed" +msgstr "Renomeado" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Deleted" +msgstr "Eliminado" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Typechange" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Stage Selected" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Stage All" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Commit Changes" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +#: modules/gdnative/gdnative_library_singleton_editor.cpp +msgid "Status" +msgstr "Estado" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "View file diffs before committing them to the latest version" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "No file diff is active" +msgstr "" + +#: editor/plugins/version_control_editor_plugin.cpp +msgid "Detect changes in file diff" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(GLES3 only)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Add Output" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Scalar" +msgstr "Escalar" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vector" +msgstr "Vector" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Boolean" +msgstr "Booleano" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Sampler" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Add input port" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Add output port" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Change input port type" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Change output port type" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Change input port name" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Change output port name" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Remove input port" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Remove output port" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Set expression" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Resize VisualShader node" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Set Uniform Name" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Set Input Default Port" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Add Node to Visual Shader" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Node(s) Moved" +msgstr "Nodo(s) Movido(s)" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Duplicate Nodes" +msgstr "Duplicar Nodos" + +#: editor/plugins/visual_shader_editor_plugin.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Paste Nodes" +msgstr "Pegar Nodos" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Delete Nodes" +msgstr "Eliminar Nodos" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Visual Shader Input Type Changed" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "UniformRef Name Changed" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vertex" +msgstr "Vertex" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Fragment" +msgstr "Fragment" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Light" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Show resulted shader code." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Create Shader Node" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Color function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Color operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Grayscale function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Converts HSV vector to RGB equivalent." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Converts RGB vector to HSV equivalent." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Sepia function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Burn operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Darken operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Difference operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Dodge operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "HardLight operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Lighten operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Overlay operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Screen operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "SoftLight operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Color constant." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Color uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the %s comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Equal (==)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than (>)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Greater Than or Equal (>=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns an associated vector if the provided scalars are equal, greater or " +"less." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between NaN and a scalar " +"parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than (<)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Less Than or Equal (<=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Not Equal (!=)" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns an associated vector if the provided boolean value is true or false." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns an associated scalar if the provided boolean value is true or false." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the boolean result of the comparison between two parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the boolean result of the comparison between INF (or NaN) and a " +"scalar parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Boolean constant." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Boolean uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for all shader modes." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Input parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for vertex and fragment shader modes." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for fragment and light shader modes." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for fragment shader mode." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for light shader mode." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for vertex shader mode." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "'%s' input parameter for vertex and fragment shader mode." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Scalar function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Scalar operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "E constant (2.718282). Represents the base of the natural logarithm." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Epsilon constant (0.00001). Smallest possible scalar number." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Phi constant (1.618034). Golden ratio." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Pi/4 constant (0.785398) or 45 degrees." +msgstr "Constante Pi/4 (0.785398), ou 45 graos." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Pi/2 constant (1.570796) or 90 degrees." +msgstr "Constante Pi/2 (1.570796), ou 90 graos." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Pi constant (3.141593) or 180 degrees." +msgstr "Constante Pi (3.141593), ou 180 graos." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Tau constant (6.283185) or 360 degrees." +msgstr "Constante Tau (6.283185), ou 360 graos." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Sqrt2 constant (1.414214). Square root of 2." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the absolute value of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the arc-cosine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the inverse hyperbolic cosine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the arc-sine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the inverse hyperbolic sine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the arc-tangent of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the arc-tangent of the parameters." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the inverse hyperbolic tangent of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Finds the nearest integer that is greater than or equal to the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Constrains a value to lie between two further values." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the cosine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the hyperbolic cosine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Converts a quantity in radians to degrees." +msgstr "Converte unha cantidade de radiáns a graos." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Base-e Exponential." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Base-2 Exponential." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Finds the nearest integer less than or equal to the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Computes the fractional part of the argument." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the inverse of the square root of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Natural logarithm." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Base-2 logarithm." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the greater of two values." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the lesser of two values." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Linear interpolation between two scalars." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the opposite value of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "1.0 - scalar" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the value of the first parameter raised to the power of the second." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Converts a quantity in degrees to radians." +msgstr "Converte unha cantidade de graos a radiáns." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "1.0 / scalar" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Finds the nearest integer to the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Finds the nearest even integer to the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Clamps the value between 0.0 and 1.0." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Extracts the sign of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the sine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the hyperbolic sine of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the square root of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if x is larger than " +"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " +"using Hermite polynomials." +msgstr "" +"SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n" +"\n" +"Devolve 0.0 se 'x' é menor que 'edge0' e 1.0 se x é maior que 'edge1'. En " +"caso contrario devólvese un valor interpolado entre 0.0 e 1.0 usando " +"polinomios de Hermite." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Step function( scalar(edge), scalar(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." +msgstr "" +"Step function( scalar(edge), scalar(x) ).\n" +"\n" +"Devolve 0.0 se 'x' e menor que 'edge'; e 1.0 en caso contrario." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the tangent of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the hyperbolic tangent of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Finds the truncated value of the parameter." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Adds scalar to scalar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Divides scalar by scalar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Multiplies scalar by scalar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the remainder of the two scalars." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Subtracts scalar from scalar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Scalar constant." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Scalar uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Perform the cubic texture lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Perform the texture lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Cubic texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "2D texture uniform lookup with triplanar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Transform function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Calculate the outer product of a pair of vectors.\n" +"\n" +"OuterProduct treats the first parameter 'c' as a column vector (matrix with " +"one column) and the second parameter 'r' as a row vector (matrix with one " +"row) and does a linear algebraic matrix multiply 'c * r', yielding a matrix " +"whose number of rows is the number of components in 'c' and whose number of " +"columns is the number of components in 'r'." +msgstr "" +"Calcula o produto exterior dun par de vectores.\n" +"\n" +"OuterProduct trata o primeiro parámetro 'c' coma un vector columna (matriz " +"con unha soa columna), e o segundo parámetro 'r' coma un vector fila (matriz " +"con unha soa fila), e fai a multiplicación alxebráica 'c * r'. Esto devolve " +"unha matriz cun número de filas igual ao número de compoñentes en 'c', e cun " +"número de columnas igual ao número de compoñentes en 'r'." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Composes transform from four vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Decomposes transform to four vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the determinant of a transform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the inverse of a transform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the transpose of a transform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Multiplies transform by transform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Multiplies vector by transform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Transform constant." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Transform uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vector function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vector operator." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Composes vector from three scalars." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Decomposes vector to three scalars." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the cross product of two vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the distance between two points." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the dot product of two vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the vector that points in the same direction as a reference vector. " +"The function has three vector parameters : N, the vector to orient, I, the " +"incident vector, and Nref, the reference vector. If the dot product of I and " +"Nref is smaller than zero the return value is N. Otherwise -N is returned." +msgstr "" +"Devolve o vector que ten a mesma dirección que o vector de referencia. A " +"función ten tres vector como parámetros: N, o vector a orientar; I, o vector " +"incidente; e Nref, o vector de referencia. Se o produto escalar de I e Nref " +"é menor que cero (forman un ángulo maior que 90 graos) entón devolve N. En " +"caso contrario devolve -N." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the length of a vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Linear interpolation between two vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Linear interpolation between two vectors using scalar." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Calculates the normalize product of vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "1.0 - vector" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "1.0 / vector" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns the vector that points in the direction of reflection ( a : incident " +"vector, b : normal vector )." +msgstr "" +"Devolve o vector que apunta na dirección de reflexo ( a : vector incidente, " +"b : vector normal)." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the vector that points in the direction of refraction." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than " +"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " +"using Hermite polynomials." +msgstr "" +"SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n" +"\n" +"Devolve 0.0 se 'x' é menor que 'edge0' e 1.0 se x é maior que 'edge1'. En " +"caso contrario devólvese un valor interpolado entre 0.0 e 1.0 usando " +"polinomios de Hermite." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge0' and 1.0 if 'x' is larger than " +"'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " +"using Hermite polynomials." +msgstr "" +"SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n" +"\n" +"Devolve 0.0 se 'x' é menor que 'edge0' e 1.0 se x é maior que 'edge1'. En " +"caso contrario devólvese un valor interpolado entre 0.0 e 1.0 usando " +"polinomios de Hermite." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Step function( vector(edge), vector(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." +msgstr "" +"Step function( vector(edge), vector(x) ).\n" +"\n" +"Devolve 0.0 se 'x' e menor que 'edge'; e 1.0 en caso contrario." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Step function( scalar(edge), vector(x) ).\n" +"\n" +"Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." +msgstr "" +"Step function( scalar(edge), vector(x) ).\n" +"\n" +"Devolve 0.0 se 'x' e menor que 'edge'; e 1.0 en caso contrario." + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Adds vector to vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Divides vector by vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Multiplies vector by vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Returns the remainder of the two vectors." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Subtracts vector from vector." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vector constant." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Vector uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Custom Godot Shader Language expression, with custom amount of input and " +"output ports. This is a direct injection of code into the vertex/fragment/" +"light function, do not use it to write the function declarations inside." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Returns falloff based on the dot product of surface normal and view " +"direction of camera (pass associated inputs to it)." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, uniforms and " +"constants." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "A reference to an existing uniform." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(Fragment/Light mode only) Scalar derivative function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "(Fragment/Light mode only) Vector derivative function." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Vector) Derivative in 'x' using local " +"differencing." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " +"differencing." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Vector) Derivative in 'y' using local " +"differencing." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " +"differencing." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " +"'y'." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "" +"(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " +"'y'." +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "VisualShader" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Edit Visual Property" +msgstr "" + +#: editor/plugins/visual_shader_editor_plugin.cpp +msgid "Visual Shader Mode Changed" +msgstr "" + +#: editor/project_export.cpp +msgid "Runnable" +msgstr "Executable" + +#: editor/project_export.cpp +msgid "Delete preset '%s'?" +msgstr "Eliminar axustes de exportación '%s'?" + +#: editor/project_export.cpp +msgid "" +"Failed to export the project for platform '%s'.\n" +"Export templates seem to be missing or invalid." +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Failed to export the project for platform '%s'.\n" +"This might be due to a configuration issue in the export preset or your " +"export settings." +msgstr "" +"Fallou a exportación do proxecto á plataforma '%s'.\n" +"Esto pode deberse a un problema cos axustes de exportación." + +#: editor/project_export.cpp +msgid "Release" +msgstr "" + +#: editor/project_export.cpp +msgid "Exporting All" +msgstr "" + +#: editor/project_export.cpp +msgid "The given export path doesn't exist:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing/corrupted:" +msgstr "" + +#: editor/project_export.cpp +msgid "Presets" +msgstr "Axustes de Exportación" + +#: editor/project_export.cpp editor/project_settings_editor.cpp +msgid "Add..." +msgstr "Engadir..." + +#: editor/project_export.cpp +msgid "" +"If checked, the preset will be available for use in one-click deploy.\n" +"Only one preset per platform may be marked as runnable." +msgstr "" +"Ao estar activado, estes axustes de exportación estarán dispoñibles para o " +"usar co despregue dun só clic.\n" +"Só uns axustes de exportación por plataforma poden marcarse como executables." + +#: editor/project_export.cpp +msgid "Export Path" +msgstr "" + +#: editor/project_export.cpp +msgid "Resources" +msgstr "Recursos" + +#: editor/project_export.cpp +msgid "Export all resources in the project" +msgstr "Exportar tódolos recursos no proxecto" + +#: editor/project_export.cpp +msgid "Export selected scenes (and dependencies)" +msgstr "" + +#: editor/project_export.cpp +msgid "Export selected resources (and dependencies)" +msgstr "" + +#: editor/project_export.cpp +msgid "Export Mode:" +msgstr "" + +#: editor/project_export.cpp +msgid "Resources to export:" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to export non-resource files/folders\n" +"(comma-separated, e.g: *.json, *.txt, docs/*)" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to exclude files/folders from project\n" +"(comma-separated, e.g: *.json, *.txt, docs/*)" +msgstr "" +"Filtros para excluír arquivos/cartafois de proxectos\n" +"(separados por coma; exemplo: *json, *.txt, docs*)" + +#: editor/project_export.cpp +msgid "Features" +msgstr "Características" + +#: editor/project_export.cpp +msgid "Custom (comma-separated):" +msgstr "" + +#: editor/project_export.cpp +msgid "Feature List:" +msgstr "" + +#: editor/project_export.cpp +msgid "Script" +msgstr "Script" + +#: editor/project_export.cpp +msgid "Script Export Mode:" +msgstr "" + +#: editor/project_export.cpp +msgid "Text" +msgstr "Texto" + +#: editor/project_export.cpp +msgid "Compiled" +msgstr "Compilado" + +#: editor/project_export.cpp +msgid "Encrypted (Provide Key Below)" +msgstr "" + +#: editor/project_export.cpp +msgid "Invalid Encryption Key (must be 64 characters long)" +msgstr "" + +#: editor/project_export.cpp +msgid "Script Encryption Key (256-bits as hex):" +msgstr "" + +#: editor/project_export.cpp +msgid "Export PCK/Zip" +msgstr "" + +#: editor/project_export.cpp +msgid "Export Project" +msgstr "Exportar Proxecto" + +#: editor/project_export.cpp +msgid "Export mode?" +msgstr "" + +#: editor/project_export.cpp +msgid "Export All" +msgstr "" + +#: editor/project_export.cpp editor/project_manager.cpp +msgid "ZIP File" +msgstr "" + +#: editor/project_export.cpp +msgid "Godot Game Pack" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing:" +msgstr "" + +#: editor/project_export.cpp +msgid "Manage Export Templates" +msgstr "" + +#: editor/project_export.cpp +msgid "Export With Debug" +msgstr "" + +#: editor/project_manager.cpp +msgid "The path specified doesn't exist." +msgstr "" + +#: editor/project_manager.cpp +msgid "Error opening package file (it's not in ZIP format)." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file." +msgstr "" +"O arquivo de proxecto '.zip' non é válido; non conteñe ningún arquivo de " +"configuración 'project.godot'." + +#: editor/project_manager.cpp +msgid "Please choose an empty folder." +msgstr "" + +#: editor/project_manager.cpp +msgid "Please choose a \"project.godot\" or \".zip\" file." +msgstr "Por favor, elixa un arquivo de tipo 'project.godot' ou '.zip'." + +#: editor/project_manager.cpp +msgid "This directory already contains a Godot project." +msgstr "O directorio xa contén un proxecto Godot." + +#: editor/project_manager.cpp +msgid "New Game Project" +msgstr "Novo Proxecto de Xogo" + +#: editor/project_manager.cpp +msgid "Imported Project" +msgstr "Proxecto Importado" + +#: editor/project_manager.cpp +msgid "Invalid Project Name." +msgstr "Nome de Proxecto Inválido." + +#: editor/project_manager.cpp +msgid "Couldn't create folder." +msgstr "" + +#: editor/project_manager.cpp +msgid "There is already a folder in this path with the specified name." +msgstr "" + +#: editor/project_manager.cpp +msgid "It would be a good idea to name your project." +msgstr "Sería unha boa idea nomear o teu proxecto." + +#: editor/project_manager.cpp +msgid "Invalid project path (changed anything?)." +msgstr "A ruta ao proxecto non é valida. Cambiaches algo?" + +#: editor/project_manager.cpp +msgid "" +"Couldn't load project.godot in project path (error %d). It may be missing or " +"corrupted." +msgstr "" +"Non se pudo cargar o arquivo de configuración 'project.godot' na ruta do " +"proxecto (erro %d). Pode ser que o arquivo non exista; ou que esté " +"corrompido." + +#: editor/project_manager.cpp +msgid "Couldn't edit project.godot in project path." +msgstr "Non se pudo editar o arquivo 'project.godot' na ruta do proxecto." + +#: editor/project_manager.cpp +msgid "Couldn't create project.godot in project path." +msgstr "Non se pudo crear o arquivo 'project.godot' na ruta do proxecto." + +#: editor/project_manager.cpp +msgid "Rename Project" +msgstr "Renomear Proxecto" + +#: editor/project_manager.cpp +msgid "Import Existing Project" +msgstr "Importar Proxecto Existente" + +#: editor/project_manager.cpp +msgid "Import & Edit" +msgstr "Importar e Editar" + +#: editor/project_manager.cpp +msgid "Create New Project" +msgstr "Crear Novo Proxecto" + +#: editor/project_manager.cpp +msgid "Create & Edit" +msgstr "Crear e Editar" + +#: editor/project_manager.cpp +msgid "Install Project:" +msgstr "Instalar Proxecto:" + +#: editor/project_manager.cpp +msgid "Install & Edit" +msgstr "Instalar e Editar" + +#: editor/project_manager.cpp +msgid "Project Name:" +msgstr "Nome do Proxecto:" + +#: editor/project_manager.cpp +msgid "Project Path:" +msgstr "Ruta do Proxecto:" + +#: editor/project_manager.cpp +msgid "Project Installation Path:" +msgstr "Ruta de Instalación do Proxecto:" + +#: editor/project_manager.cpp +msgid "Renderer:" +msgstr "Renderizador:" + +#: editor/project_manager.cpp +msgid "OpenGL ES 3.0" +msgstr "OpenGL ES 3.0" + +#: editor/project_manager.cpp +msgid "Not supported by your GPU drivers." +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"Higher visual quality\n" +"All features available\n" +"Incompatible with older hardware\n" +"Not recommended for web games" +msgstr "" + +#: editor/project_manager.cpp +msgid "OpenGL ES 2.0" +msgstr "OpenGL ES 2.0" + +#: editor/project_manager.cpp +msgid "" +"Lower visual quality\n" +"Some features not available\n" +"Works on most hardware\n" +"Recommended for web games" +msgstr "" + +#: editor/project_manager.cpp +msgid "Renderer can be changed later, but scenes may need to be adjusted." +msgstr "" + +#: editor/project_manager.cpp +msgid "Unnamed Project" +msgstr "Proxecto Sen Nome" + +#: editor/project_manager.cpp +msgid "Missing Project" +msgstr "Proxecto Faltante" + +#: editor/project_manager.cpp +msgid "Error: Project is missing on the filesystem." +msgstr "Erro: O proxecto non se pode encontrar no sistema de arquivos." + +#: editor/project_manager.cpp +msgid "Can't open project at '%s'." +msgstr "Non se pode abrir proxecto en '%s'." + +#: editor/project_manager.cpp +msgid "Are you sure to open more than one project?" +msgstr "Está seguro de que quere abrir máis dun proxecto?" + +#: editor/project_manager.cpp +msgid "" +"The following project settings file does not specify the version of Godot " +"through which it was created.\n" +"\n" +"%s\n" +"\n" +"If you proceed with opening it, it will be converted to Godot's current " +"configuration file format.\n" +"Warning: You won't be able to open the project with previous versions of the " +"engine anymore." +msgstr "" +"O arquivo de configuración do seguinte proxecto non especifica a versión de " +"Godot ca cal foi creado.\n" +"\n" +"%s\n" +"\n" +"Se o abres o arquivo de configuración será convertido ao formato utilizado " +"na versión actual de Godot.\n" +"Aviso: Xa non poderás volver a abrir este proxecto con versións anteriores " +"de Godot." + +#: editor/project_manager.cpp +msgid "" +"The following project settings file was generated by an older engine " +"version, and needs to be converted for this version:\n" +"\n" +"%s\n" +"\n" +"Do you want to convert it?\n" +"Warning: You won't be able to open the project with previous versions of the " +"engine anymore." +msgstr "" +"O arquivo de configuración do seguinte proxecto foi xerado por unha versión " +"antiga de Godot, e é necesario convertelo á versión actual:\n" +"\n" +"%s\n" +"\n" +"Queres convertelo?\n" +"Aviso: Xa non poderás abrir o proxecto con versións anteriores de Godot." + +#: editor/project_manager.cpp +msgid "" +"The project settings were created by a newer engine version, whose settings " +"are not compatible with this version." +msgstr "" +"A configuración do proxecto foi creada por versións máis novas de Godot; " +"facéndoa incompatible con esta versión." + +#: editor/project_manager.cpp +msgid "" +"Can't run project: no main scene defined.\n" +"Please edit the project and set the main scene in the Project Settings under " +"the \"Application\" category." +msgstr "" +"Non se pode executar o proxecto: non hai unha escena principal definida.\n" +"Por favor, selecciona unha escena principal en \"Configuración do Proxecto" +"\", na categoría \"Aplicación\"." + +#: editor/project_manager.cpp +msgid "" +"Can't run project: Assets need to be imported.\n" +"Please edit the project to trigger the initial import." +msgstr "" + +#: editor/project_manager.cpp +msgid "Are you sure to run %d projects at once?" +msgstr "Seguro que queres executar %d proxectos ao mesmo tempo?" + +#: editor/project_manager.cpp +msgid "" +"Remove %d projects from the list?\n" +"The project folders' contents won't be modified." +msgstr "" +"Eliminar %d proxectos da lista?\n" +"Os contidos da carpeta de proxectos non serán modificados." + +#: editor/project_manager.cpp +msgid "" +"Remove this project from the list?\n" +"The project folder's contents won't be modified." +msgstr "" +"Eliminar este proxecto da lista?\n" +"Os contidos da carpeta de proxectos non serán modificados." + +#: editor/project_manager.cpp +msgid "" +"Remove all missing projects from the list?\n" +"The project folders' contents won't be modified." +msgstr "" +"Eliminar todos os proxectos faltantes da lista?\n" +"Os contidos da carpeta de proxectos non serán modificados." + +#: editor/project_manager.cpp +msgid "" +"Language changed.\n" +"The interface will update after restarting the editor or project manager." +msgstr "" +"Linguaxe cambiada.\n" +"A interface actualizarase despois de reiniciar o editor ou administrador de " +"proxectos." + +#: editor/project_manager.cpp +msgid "" +"Are you sure to scan %s folders for existing Godot projects?\n" +"This could take a while." +msgstr "" +"Seguro que quere escanear proxectos de Godot en %s cartafois?\n" +"Esto podería demorarse un tempo." + +#. TRANSLATORS: This refers to the application where users manage their Godot projects. +#: editor/project_manager.cpp +msgid "Project Manager" +msgstr "Administrador de Proxectos" + +#: editor/project_manager.cpp +msgid "Projects" +msgstr "Proxectos" + +#: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "" +"Examinando arquivos,\n" +"Por favor, espere..." + +#: editor/project_manager.cpp +msgid "Last Modified" +msgstr "Derradeira Modificación" + +#: editor/project_manager.cpp +msgid "Scan" +msgstr "Escanear" + +#: editor/project_manager.cpp +msgid "Select a Folder to Scan" +msgstr "Seleccionar un Cartafol para Escanear" + +#: editor/project_manager.cpp +msgid "New Project" +msgstr "Novo Proxecto" + +#: editor/project_manager.cpp +msgid "Remove Missing" +msgstr "Eliminar Faltantes" + +#: editor/project_manager.cpp +msgid "Templates" +msgstr "Proxectos Modelo" + +#: editor/project_manager.cpp +msgid "Restart Now" +msgstr "Reiniciar Agora" + +#: editor/project_manager.cpp +msgid "Can't run project" +msgstr "Non se pode executar proxecto" + +#: editor/project_manager.cpp +msgid "" +"You currently don't have any projects.\n" +"Would you like to explore official example projects in the Asset Library?" +msgstr "" +"Actualmente non tes ningún proxecto.\n" +"Gustaríalle buscar proxectos de exemplo oficiais na biblioteca de Assets?" + +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" +"A barra de búsqueda filtra os proxectos por nome e último compoñente da súa " +"ruta.\n" +"Se quere filtrar proxectos por nome e ruta completa, a consulta debe conter " +"polo menos un carácter '/'." + +#: editor/project_settings_editor.cpp +msgid "Key " +msgstr "Botón: " + +#: editor/project_settings_editor.cpp +msgid "Joy Button" +msgstr "Botón Joystick" + +#: editor/project_settings_editor.cpp +msgid "Joy Axis" +msgstr "Eixe Joystick" + +#: editor/project_settings_editor.cpp +msgid "Mouse Button" +msgstr "Botón do Rato" + +#: editor/project_settings_editor.cpp +msgid "" +"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or " +"'\"'" +msgstr "" +"Nome de acción inválido. O nome non pode estar baleiro, nin conter '/', ':', " +"'=', '\\' ou '\"'" + +#: editor/project_settings_editor.cpp +msgid "An action with the name '%s' already exists." +msgstr "Xa existe unha acción co nome '%s'." + +#: editor/project_settings_editor.cpp +msgid "Rename Input Action Event" +msgstr "Renomear Evento de Entrada" + +#: editor/project_settings_editor.cpp +msgid "Change Action deadzone" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Input Action Event" +msgstr "Engadir Evento de Entrada" + +#: editor/project_settings_editor.cpp +msgid "All Devices" +msgstr "Tódolos Dispositivos" + +#: editor/project_settings_editor.cpp +msgid "Device" +msgstr "Dispositivo" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Press a Key..." +msgstr "Pulse algún botón..." + +#: editor/project_settings_editor.cpp +msgid "Mouse Button Index:" +msgstr "Índice do Botón do Rato:" + +#: editor/project_settings_editor.cpp +msgid "Left Button" +msgstr "Botón Esquerdo" + +#: editor/project_settings_editor.cpp +msgid "Right Button" +msgstr "Botón Dereito" + +#: editor/project_settings_editor.cpp +msgid "Middle Button" +msgstr "Botón Central" + +#: editor/project_settings_editor.cpp +msgid "Wheel Up Button" +msgstr "Mover Roda cara Arriba" + +#: editor/project_settings_editor.cpp +msgid "Wheel Down Button" +msgstr "Mover Roda cara Abaixo" + +#: editor/project_settings_editor.cpp +msgid "Wheel Left Button" +msgstr "Mover Roda cara a Esquerda" + +#: editor/project_settings_editor.cpp +msgid "Wheel Right Button" +msgstr "Mover Roda cara a Dereita" + +#: editor/project_settings_editor.cpp +msgid "X Button 1" +msgstr "Botón X 1" + +#: editor/project_settings_editor.cpp +msgid "X Button 2" +msgstr "Botón X 2" + +#: editor/project_settings_editor.cpp +msgid "Joypad Axis Index:" +msgstr "Índice do Eixe do Joystick:" + +#: editor/project_settings_editor.cpp +msgid "Axis" +msgstr "Eixe" + +#: editor/project_settings_editor.cpp +msgid "Joypad Button Index:" +msgstr "Índice do Botón do Joystick:" + +#: editor/project_settings_editor.cpp +msgid "Erase Input Action" +msgstr "Eliminar Acción de Entrada" + +#: editor/project_settings_editor.cpp +msgid "Erase Input Action Event" +msgstr "Eliminar Evento de Entrada" + +#: editor/project_settings_editor.cpp +msgid "Add Event" +msgstr "Engadir Evento" + +#: editor/project_settings_editor.cpp +msgid "Button" +msgstr "Botón" + +#: editor/project_settings_editor.cpp +msgid "Left Button." +msgstr "Botón Esquerdo." + +#: editor/project_settings_editor.cpp +msgid "Right Button." +msgstr "Botón Dereito." + +#: editor/project_settings_editor.cpp +msgid "Middle Button." +msgstr "Botón Central." + +#: editor/project_settings_editor.cpp +msgid "Wheel Up." +msgstr "Roda cara Arriba." + +#: editor/project_settings_editor.cpp +msgid "Wheel Down." +msgstr "Roda cara Abaixo." + +#: editor/project_settings_editor.cpp +msgid "Add Global Property" +msgstr "Engadir Propiedade Global" + +#: editor/project_settings_editor.cpp +msgid "Select a setting item first!" +msgstr "Primeiro seleccione un elemento!" + +#: editor/project_settings_editor.cpp +msgid "No property '%s' exists." +msgstr "Non existe a propiedade '%s'." + +#: editor/project_settings_editor.cpp +msgid "Setting '%s' is internal, and it can't be deleted." +msgstr "A propiedade '%s' é interna, e non pode ser eliminada." + +#: editor/project_settings_editor.cpp +msgid "Delete Item" +msgstr "Eliminar Elemento" + +#: editor/project_settings_editor.cpp +msgid "" +"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " +"'\"'." +msgstr "" +"Nome de acción inválido. Non pode estar baleiro, nin pode conter '/', ':', " +"'=', '\\' ou '\"'." + +#: editor/project_settings_editor.cpp +msgid "Add Input Action" +msgstr "Engadir Acción de Entrada" + +#: editor/project_settings_editor.cpp +msgid "Error saving settings." +msgstr "Erro gardando os axustes." + +#: editor/project_settings_editor.cpp +msgid "Settings saved OK." +msgstr "Axustes gardados correctamente." + +#: editor/project_settings_editor.cpp +msgid "Moved Input Action Event" +msgstr "Evento de Entrada Movido" + +#: editor/project_settings_editor.cpp +msgid "Override for Feature" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Add Translation" +msgstr "Engadir Tradución" + +#: editor/project_settings_editor.cpp +msgid "Remove Translation" +msgstr "Eliminar Tradución" + +#: editor/project_settings_editor.cpp +msgid "Add Remapped Path" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Resource Remap Add Remap" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Change Resource Remap Language" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Resource Remap" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Remove Resource Remap Option" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Changed Locale Filter" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Changed Locale Filter Mode" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Project Settings (project.godot)" +msgstr "Configuración do Proxecto (project.godot)" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "General" +msgstr "Xeral" + +#: editor/project_settings_editor.cpp +msgid "Override For..." +msgstr "" + +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "The editor must be restarted for changes to take effect." +msgstr "O editor ten que reiniciarse para que os cambios teñan efecto." + +#: editor/project_settings_editor.cpp +msgid "Input Map" +msgstr "Mapeado de Entradas" + +#: editor/project_settings_editor.cpp +msgid "Action:" +msgstr "Acción:" + +#: editor/project_settings_editor.cpp +msgid "Action" +msgstr "Acción" + +#: editor/project_settings_editor.cpp +msgid "Deadzone" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Device:" +msgstr "Dispositivo:" + +#: editor/project_settings_editor.cpp +msgid "Index:" +msgstr "Índice:" + +#: editor/project_settings_editor.cpp +msgid "Localization" +msgstr "Linguaxe" + +#: editor/project_settings_editor.cpp +msgid "Translations" +msgstr "Traducións" + +#: editor/project_settings_editor.cpp +msgid "Translations:" +msgstr "Traducións:" + +#: editor/project_settings_editor.cpp +msgid "Remaps" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Resources:" +msgstr "Recursos:" + +#: editor/project_settings_editor.cpp +msgid "Remaps by Locale:" +msgstr "" + +#: editor/project_settings_editor.cpp +msgid "Locale" +msgstr "Linguaxe" + +#: editor/project_settings_editor.cpp +msgid "Locales Filter" +msgstr "Filtrar Linguaxes" + +#: editor/project_settings_editor.cpp +msgid "Show All Locales" +msgstr "Amosar Tódolos Linguaxes" + +#: editor/project_settings_editor.cpp +msgid "Show Selected Locales Only" +msgstr "Amosar só os Linguaxes Seleccionados" + +#: editor/project_settings_editor.cpp +msgid "Filter mode:" +msgstr "Modo de Filtrado:" + +#: editor/project_settings_editor.cpp +msgid "Locales:" +msgstr "Linguaxes:" + +#: editor/project_settings_editor.cpp +msgid "AutoLoad" +msgstr "AutoCargador" + +#: editor/project_settings_editor.cpp +msgid "Plugins" +msgstr "Características Adicionais (Plugins)" + +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Cargar Valores por Defecto" + +#: editor/property_editor.cpp +msgid "Preset..." +msgstr "" + +#: editor/property_editor.cpp +msgid "Zero" +msgstr "Cero" + +#: editor/property_editor.cpp +msgid "Easing In-Out" +msgstr "" + +#: editor/property_editor.cpp +msgid "Easing Out-In" +msgstr "" + +#: editor/property_editor.cpp +msgid "File..." +msgstr "Arquivo..." + +#: editor/property_editor.cpp +msgid "Dir..." +msgstr "Directorio..." + +#: editor/property_editor.cpp +msgid "Assign" +msgstr "Asignar" + +#: editor/property_editor.cpp +msgid "Select Node" +msgstr "Seleccionar Nodos" + +#: editor/property_editor.cpp +msgid "Error loading file: Not a resource!" +msgstr "Erro cargando arquivo: Non é un recurso!" + +#: editor/property_editor.cpp +msgid "Pick a Node" +msgstr "Elixe un Nodo" + +#: editor/property_editor.cpp +msgid "Bit %d, val %d." +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Property" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Virtual Method" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Method" +msgstr "" + +#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp +msgid "Batch Rename" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Replace:" +msgstr "Substituír:" + +#: editor/rename_dialog.cpp +msgid "Prefix:" +msgstr "Prefixo:" + +#: editor/rename_dialog.cpp +msgid "Suffix:" +msgstr "Sufixo:" + +#: editor/rename_dialog.cpp +msgid "Use Regular Expressions" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Advanced Options" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Substitute" +msgstr "Substituír" + +#: editor/rename_dialog.cpp +msgid "Node name" +msgstr "Nome do nodo" + +#: editor/rename_dialog.cpp +msgid "Node's parent name, if available" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Node type" +msgstr "Tipo de nodo" + +#: editor/rename_dialog.cpp +msgid "Current scene name" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Root node name" +msgstr "Nome do nodo raíz" + +#: editor/rename_dialog.cpp +msgid "" +"Sequential integer counter.\n" +"Compare counter options." +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Per-level Counter" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "If set, the counter restarts for each group of child nodes." +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Initial value for the counter" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Step" +msgstr "Paso" + +#: editor/rename_dialog.cpp +msgid "Amount by which counter is incremented for each node" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Padding" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "" +"Minimum number of digits for the counter.\n" +"Missing digits are padded with leading zeros." +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Post-Process" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Keep" +msgstr "Manter" + +#: editor/rename_dialog.cpp +msgid "PascalCase to snake_case" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "snake_case to PascalCase" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Case" +msgstr "Maiús./Minús." + +#: editor/rename_dialog.cpp +msgid "To Lowercase" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "To Uppercase" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "Reset" +msgstr "Restablecer" + +#: editor/rename_dialog.cpp +msgid "Regular Expression Error:" +msgstr "" + +#: editor/rename_dialog.cpp +msgid "At character %s" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent Node" +msgstr "Remparentar Nodo" + +#: editor/reparent_dialog.cpp +msgid "Reparent Location (Select new Parent):" +msgstr "" + +#: editor/reparent_dialog.cpp +msgid "Keep Global Transform" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent" +msgstr "Remparentar" + +#: editor/run_settings_dialog.cpp +msgid "Run Mode:" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Current Scene" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Main Scene" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Main Scene Arguments:" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Scene Run Settings" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "No parent to instance the scenes at." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error loading scene from %s" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Cannot instance the scene '%s' because the current scene exists within one " +"of its nodes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instance Scene(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Replace with Branch Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instance Child Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Pegar Nodos" + +#: editor/scene_tree_dock.cpp +msgid "Detach Script" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on the tree root." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Move Node In Parent" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Move Nodes In Parent" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Duplicate Node(s)" +msgstr "Duplicar Nodo(s)" + +#: editor/scene_tree_dock.cpp +msgid "Can't reparent nodes in inherited scenes, order of nodes can't change." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Node must belong to the edited scene to become root." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instantiated scenes can't become root" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Make node as Root" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete %d nodes and any children?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete %d nodes?" +msgstr "Eliminar %d nodos?" + +#: editor/scene_tree_dock.cpp +msgid "Delete the root node \"%s\"?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete node \"%s\" and its children?" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete node \"%s\"?" +msgstr "Eliminar nodo \"%s\"?" + +#: editor/scene_tree_dock.cpp +msgid "Can not perform with the root node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on instanced scenes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Save New Scene As..." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Disabling \"editable_instance\" will cause all properties of the node to be " +"reverted to their default." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Enabling \"Load As Placeholder\" will disable \"Editable Children\" and " +"cause all properties of the node to be reverted to their default." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Make Local" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "New Scene Root" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Create Root Node:" +msgstr "Crear nodo raíz:" + +#: editor/scene_tree_dock.cpp +msgid "2D Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "3D Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "User Interface" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Other Node" +msgstr "Outro Nodo" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes from a foreign scene!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes the current scene inherits from!" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Attach Script" +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Cortar Nodos" + +#: editor/scene_tree_dock.cpp +msgid "Remove Node(s)" +msgstr "Eliminar Nodo(s)" + +#: editor/scene_tree_dock.cpp +msgid "Change type of node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Couldn't save new scene. Likely dependencies (instances) couldn't be " +"satisfied." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error saving scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error duplicating scene to save it." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Sub-Resources" +msgstr "Sub-Recursos" + +#: editor/scene_tree_dock.cpp +msgid "Clear Inheritance" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Editable Children" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Load As Placeholder" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Open Documentation" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Cannot attach a script: there are no languages registered.\n" +"This is probably because this editor was built with all language modules " +"disabled." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Add Child Node" +msgstr "Engadir Nodo Fillo" + +#: editor/scene_tree_dock.cpp +msgid "Expand/Collapse All" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Change Type" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Reparent to New Node" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Make Scene Root" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Merge From Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp +msgid "Save Branch as Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp +msgid "Copy Node Path" +msgstr "Copiar Ruta do Nodo" + +#: editor/scene_tree_dock.cpp +msgid "Delete (No Confirm)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Add/Create a New Node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Instance a scene file as a Node. Creates an inherited scene if no root node " +"exists." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Attach a new or existing script to the selected node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Detach the script from the selected node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Remote" +msgstr "Remoto" + +#: editor/scene_tree_dock.cpp +msgid "Local" +msgstr "Local" + +#: editor/scene_tree_dock.cpp +msgid "Clear Inheritance? (No Undo!)" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visible" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Unlock Node" +msgstr "Desbloquear Nodo" + +#: editor/scene_tree_editor.cpp +msgid "Button Group" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "(Connecting From)" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "Aviso sobre a configuración do nodo:" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has %s connection(s) and %s group(s).\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has %s connection(s).\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in %s group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Open Script:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock it." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"AnimationPlayer is pinned.\n" +"Click to unpin." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Invalid node name, the following characters are not allowed:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Rename Node" +msgstr "Renomear Nodo" + +#: editor/scene_tree_editor.cpp +msgid "Scene Tree (Nodes):" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Node Configuration Warning!" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Select a Node" +msgstr "Seleccione un Nodo" + +#: editor/script_create_dialog.cpp +msgid "Path is empty." +msgstr "A ruta está baleira." + +#: editor/script_create_dialog.cpp +msgid "Filename is empty." +msgstr "O nome de arquivo está baleiro." + +#: editor/script_create_dialog.cpp +msgid "Path is not local." +msgstr "A ruta non é local." + +#: editor/script_create_dialog.cpp +msgid "Invalid base path." +msgstr "Ruta base inválida." + +#: editor/script_create_dialog.cpp +msgid "A directory with the same name exists." +msgstr "Xa existe un directorio co mesmo nome." + +#: editor/script_create_dialog.cpp +msgid "File does not exist." +msgstr "O arquivo non existe." + +#: editor/script_create_dialog.cpp +msgid "Invalid extension." +msgstr "Extensión inválida." + +#: editor/script_create_dialog.cpp +msgid "Wrong extension chosen." +msgstr "Extensión incorrecta elixida." + +#: editor/script_create_dialog.cpp +msgid "Error loading template '%s'" +msgstr "Erro cargando o modelo '%s'" + +#: editor/script_create_dialog.cpp +msgid "Error - Could not create script in filesystem." +msgstr "Erro - Non se puido gardar o Script no sistema de arquivos." + +#: editor/script_create_dialog.cpp +msgid "Error loading script from %s" +msgstr "Erro cargando script desde %s" + +#: editor/script_create_dialog.cpp +msgid "Overrides" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "N/A" +msgstr "N/A" + +#: editor/script_create_dialog.cpp +msgid "Open Script / Choose Location" +msgstr "Abrir Script / Elixir Ubicación" + +#: editor/script_create_dialog.cpp +msgid "Open Script" +msgstr "Abrir Script" + +#: editor/script_create_dialog.cpp +msgid "File exists, it will be reused." +msgstr "O arquivo xa existe; será reutilizado." + +#: editor/script_create_dialog.cpp +msgid "Invalid path." +msgstr "Ruta inválida." + +#: editor/script_create_dialog.cpp +msgid "Invalid class name." +msgstr "Nome de clase inválido." + +#: editor/script_create_dialog.cpp +msgid "Invalid inherited parent name or path." +msgstr "A ruta ou o nome do pai herdado é inválido." + +#: editor/script_create_dialog.cpp +msgid "Script path/name is valid." +msgstr "A ruta e nome do script son válidos." + +#: editor/script_create_dialog.cpp +msgid "Allowed: a-z, A-Z, 0-9, _ and ." +msgstr "Permitido: a-z, A-Z, 0-9,_ e ." + +#: editor/script_create_dialog.cpp +msgid "Built-in script (into scene file)." +msgstr "Script integrada na escena." + +#: editor/script_create_dialog.cpp +msgid "Will create a new script file." +msgstr "Crearase un novo arquivo de script." + +#: editor/script_create_dialog.cpp +msgid "Will load an existing script file." +msgstr "Cargarase un arquivo de script xa existente." + +#: editor/script_create_dialog.cpp +msgid "Script file already exists." +msgstr "Xa existe un arquivo script na mesma ruta." + +#: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" +"Nota: Os scripts integrados teñen algunhas limitacións, e non poden editarse " +"usando editores externos." + +#: editor/script_create_dialog.cpp +msgid "Class Name:" +msgstr "Nome da Clase:" + +#: editor/script_create_dialog.cpp +msgid "Template:" +msgstr "Modelo:" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script:" +msgstr "Script Integrado:" + +#: editor/script_create_dialog.cpp +msgid "Attach Node Script" +msgstr "Adxuntar Script de Nodo" + +#: editor/script_editor_debugger.cpp +msgid "Remote " +msgstr "Remoto " + +#: editor/script_editor_debugger.cpp +msgid "Bytes:" +msgstr "Bytes:" + +#: editor/script_editor_debugger.cpp +msgid "Warning:" +msgstr "Aviso:" + +#: editor/script_editor_debugger.cpp +msgid "Error:" +msgstr "Erro:" + +#: editor/script_editor_debugger.cpp +msgid "C++ Error" +msgstr "Erro de C++" + +#: editor/script_editor_debugger.cpp +msgid "C++ Error:" +msgstr "Erro de C++:" + +#: editor/script_editor_debugger.cpp +msgid "C++ Source" +msgstr "Fonte C++" + +#: editor/script_editor_debugger.cpp +msgid "Source:" +msgstr "Fonte:" + +#: editor/script_editor_debugger.cpp +msgid "C++ Source:" +msgstr "Fonte C++:" + +#: editor/script_editor_debugger.cpp +msgid "Stack Trace" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Errors" +msgstr "Erros" + +#: editor/script_editor_debugger.cpp +msgid "Child process connected." +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Copy Error" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Video RAM" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Skip Breakpoints" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Previous Instance" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Next Instance" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Stack Frames" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Profiler" +msgstr "Analítica de Rendemento" + +#: editor/script_editor_debugger.cpp +msgid "Network Profiler" +msgstr "Analítica de Rendemento de Rede" + +#: editor/script_editor_debugger.cpp +msgid "Monitor" +msgstr "Monitor" + +#: editor/script_editor_debugger.cpp +msgid "Value" +msgstr "Valor" + +#: editor/script_editor_debugger.cpp +msgid "Monitors" +msgstr "Monitores" + +#: editor/script_editor_debugger.cpp +msgid "Pick one or more items from the list to display the graph." +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "List of Video Memory Usage by Resource:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Total:" +msgstr "Total:" + +#: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Resource Path" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Type" +msgstr "Tipo" + +#: editor/script_editor_debugger.cpp +msgid "Format" +msgstr "Formato" + +#: editor/script_editor_debugger.cpp +msgid "Usage" +msgstr "Uso" + +#: editor/script_editor_debugger.cpp +msgid "Misc" +msgstr "Outros" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control Type:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Live Edit Root:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Set From Tree" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Export measures as CSV" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Erase Shortcut" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Restore Shortcut" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Change Shortcut" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Editor Settings" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Shortcuts" +msgstr "Atallos" + +#: editor/settings_config_dialog.cpp +msgid "Binding" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Light Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change AudioStreamPlayer3D Emission Angle" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera FOV" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera Size" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Notifier AABB" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Particles AABB" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Probe Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp +msgid "Change Sphere Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp +msgid "Change Box Shape Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Height" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Cylinder Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Cylinder Shape Height" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Ray Shape Length" +msgstr "" + +#: modules/csg/csg_gizmos.cpp +msgid "Change Cylinder Radius" +msgstr "" + +#: modules/csg/csg_gizmos.cpp +msgid "Change Cylinder Height" +msgstr "" + +#: modules/csg/csg_gizmos.cpp +msgid "Change Torus Inner Radius" +msgstr "" + +#: modules/csg/csg_gizmos.cpp +msgid "Change Torus Outer Radius" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Select the dynamic library for this entry" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Select dependencies of the library for this entry" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Remove current entry" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Double click to create a new entry" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Platform:" +msgstr "Plataforma:" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Platform" +msgstr "Plataforma" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Dynamic Library" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "Add an architecture entry" +msgstr "" + +#: modules/gdnative/gdnative_library_editor_plugin.cpp +msgid "GDNativeLibrary" +msgstr "" + +#: modules/gdnative/gdnative_library_singleton_editor.cpp +msgid "Enabled GDNative Singleton" +msgstr "" + +#: modules/gdnative/gdnative_library_singleton_editor.cpp +msgid "Disabled GDNative Singleton" +msgstr "" + +#: modules/gdnative/gdnative_library_singleton_editor.cpp +msgid "Library" +msgstr "Biblioteca" + +#: modules/gdnative/gdnative_library_singleton_editor.cpp +msgid "Libraries: " +msgstr "Bibliotecas: " + +#: modules/gdnative/register_types.cpp +msgid "GDNative" +msgstr "GDNative" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Step argument is zero!" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not a script with an instance" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not based on a script" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Not based on a resource file" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (missing @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (can't load script at @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary format (invalid script at @path)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Invalid instance dictionary (invalid subclasses)" +msgstr "" + +#: modules/gdscript/gdscript_functions.cpp +msgid "Object can't provide a length." +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Next Plane" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Previous Plane" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Plane:" +msgstr "Plano:" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Next Floor" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Previous Floor" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Floor:" +msgstr "Chan:" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Delete Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Fill Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Paste Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Paint" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Grid Map" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Snap View" +msgstr "Axustar Vista" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Disabled" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Above" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clip Below" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit X Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit Y Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Edit Z Axis" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate X" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate Y" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Rotate Z" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate X" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate Y" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Back Rotate Z" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Cursor Clear Rotation" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Paste Selects" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Clear Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Fill Selection" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "GridMap Settings" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Pick Distance:" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Filter meshes" +msgstr "" + +#: modules/gridmap/grid_map_editor_plugin.cpp +msgid "Give a MeshLibrary resource to this GridMap to use its meshes." +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Begin Bake" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Preparing data structures" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Generate buffers" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Direct lighting" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Indirect lighting" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Post processing" +msgstr "" + +#: modules/lightmapper_cpu/lightmapper_cpu.cpp +msgid "Plotting lightmaps" +msgstr "" + +#: modules/mono/csharp_script.cpp +msgid "Class name can't be a reserved keyword" +msgstr "" + +#: modules/mono/mono_gd/gd_mono_utils.cpp +msgid "End of inner exception stack trace" +msgstr "" + +#: modules/recast/navigation_mesh_editor_plugin.cpp +msgid "Bake NavMesh" +msgstr "" + +#: modules/recast/navigation_mesh_editor_plugin.cpp +msgid "Clear the navigation mesh." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Setting up Configuration..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Calculating grid size..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Creating heightfield..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Marking walkable triangles..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Constructing compact heightfield..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Eroding walkable area..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Partitioning..." +msgstr "Particionando..." + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Creating contours..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Creating polymesh..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Converting to native navigation mesh..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Navigation Mesh Generator Setup:" +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Parsing Geometry..." +msgstr "" + +#: modules/recast/navigation_mesh_generator.cpp +msgid "Done!" +msgstr "Feito!" + +#: modules/visual_script/visual_script.cpp +msgid "" +"A node yielded without working memory, please read the docs on how to yield " +"properly!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Node yielded, but did not return a function state in the first working " +"memory." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Return value must be assigned to first element of node working memory! Fix " +"your node please." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Node returned an invalid sequence output: " +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Found sequence bit but not the node in the stack, report bug!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Stack overflow with stack depth: " +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Signal Arguments" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Argument Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Argument name" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Set Variable Default Value" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Set Variable Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Input Port" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Output Port" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Override an existing built-in function." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Create a new function." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Variables:" +msgstr "Variables:" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Create a new variable." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Signals:" +msgstr "Sinais:" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Create a new signal." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name is not a valid identifier:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name already in use by another func/var/signal:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Delete input port" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Variable" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Signal" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Input Port" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Output Port" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Expression" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Duplicate VisualScript Nodes" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold %s to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Preload Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node(s) From Tree" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "" +"Can't drop properties because script '%s' is not used in this scene.\n" +"Drop holding 'Shift' to just copy the signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Getter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Setter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Base Type" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Move Node(s)" +msgstr "Mover Nodo(s)" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove VisualScript Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Connect Nodes" +msgstr "Conectar Nodos" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Disconnect Nodes" +msgstr "Desconectar Nodos" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Connect Node Data" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Connect Node Sequence" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Script already has function '%s'" +msgstr "O script xa ten unha función chamada '%s'" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Input Value" +msgstr "Cambiar Valor de Entrada" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Resize Comment" +msgstr "Cambiar Tamaño do Comentario" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't copy the function node." +msgstr "Non se pode copiar o nodo función." + +#: modules/visual_script/visual_script_editor.cpp +msgid "Clipboard is empty!" +msgstr "O portapapeis está baleiro!" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Paste VisualScript Nodes" +msgstr "Pegar Nodos VisualScript" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't create function with a function node." +msgstr "Non se pode crear unha función cun nodo función." + +#: modules/visual_script/visual_script_editor.cpp +msgid "Can't create function of nodes from nodes of multiple functions." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Select at least one node with sequence port." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Try to only have one sequence input in selection." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Create Function" +msgstr "Crear Función" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Function" +msgstr "Eliminar Función" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Variable" +msgstr "Eliminar Variable" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Variable:" +msgstr "Editando Variable:" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Signal" +msgstr "Eliminar Sinal" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Signal:" +msgstr "Editando Sinal:" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Make Tool:" +msgstr "Ferramenta:" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Members:" +msgstr "Membros:" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Base Type:" +msgstr "Cambiar Tipo Base:" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Nodes..." +msgstr "Engadir Nodos..." + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Function..." +msgstr "Engadir Función..." + +#: modules/visual_script/visual_script_editor.cpp +msgid "function_name" +msgstr "nome_da_funcion" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Select or create a function to edit its graph." +msgstr "Seleccione ou cree unha función para editar a sua gráfica." + +#: modules/visual_script/visual_script_editor.cpp +msgid "Delete Selected" +msgstr "Eliminar Selección" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Find Node Type" +msgstr "Encontrar Tipo de Nodo" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Copy Nodes" +msgstr "Copiar Nodos" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Cut Nodes" +msgstr "Cortar Nodos" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Make Function" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Refresh Graph" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Member" +msgstr "Editar Membro" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Input type not iterable: " +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid: " +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name." +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Base object is not a Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Path does not lead Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name '%s' in node %s." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid ": Invalid argument of type: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid ": Invalid arguments: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "VariableGet not found in script: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "VariableSet not found in script: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Custom node has no _step() method, can't process graph." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "" +"Invalid return value from _step(), must be integer (seq out), or string " +"(error)." +msgstr "" + +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Search VisualScript" +msgstr "Buscar en VisualScript" + +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Get %s" +msgstr "" + +#: modules/visual_script/visual_script_property_selector.cpp +msgid "Set %s" +msgstr "" + +#: platform/android/export/export.cpp +msgid "Package name is missing." +msgstr "" + +#: platform/android/export/export.cpp +msgid "Package segments must be of non-zero length." +msgstr "" + +#: platform/android/export/export.cpp +msgid "The character '%s' is not allowed in Android application package names." +msgstr "" + +#: platform/android/export/export.cpp +msgid "A digit cannot be the first character in a package segment." +msgstr "" + +#: platform/android/export/export.cpp +msgid "The character '%s' cannot be the first character in a package segment." +msgstr "" + +#: platform/android/export/export.cpp +msgid "The package must have at least one '.' separator." +msgstr "" + +#: platform/android/export/export.cpp +msgid "Select device from the list" +msgstr "" + +#: platform/android/export/export.cpp +msgid "Unable to find the 'apksigner' tool." +msgstr "" + +#: platform/android/export/export.cpp +msgid "" +"Android build template not installed in the project. Install it from the " +"Project menu." +msgstr "" + +#: platform/android/export/export.cpp +msgid "Debug keystore not configured in the Editor Settings nor in the preset." +msgstr "" +"Non está configurado o Keystore de depuración nin na configuración do " +"editor, nin nos axustes de exportación." + +#: platform/android/export/export.cpp +msgid "Release keystore incorrectly configured in the export preset." +msgstr "" +"O Keystore Release non está configurado correctamente nos axustes de " +"exportación." + +#: platform/android/export/export.cpp +msgid "A valid Android SDK path is required in Editor Settings." +msgstr "" + +#: platform/android/export/export.cpp +msgid "Invalid Android SDK path in Editor Settings." +msgstr "" + +#: platform/android/export/export.cpp +msgid "Missing 'platform-tools' directory!" +msgstr "" + +#: platform/android/export/export.cpp +msgid "Unable to find Android SDK platform-tools' adb command." +msgstr "" + +#: platform/android/export/export.cpp +msgid "Please check in the Android SDK directory specified in Editor Settings." +msgstr "" + +#: platform/android/export/export.cpp +msgid "Missing 'build-tools' directory!" +msgstr "" + +#: platform/android/export/export.cpp +msgid "Unable to find Android SDK build-tools' apksigner command." +msgstr "" + +#: platform/android/export/export.cpp +msgid "Invalid public key for APK expansion." +msgstr "" + +#: platform/android/export/export.cpp +msgid "Invalid package name:" +msgstr "" + +#: platform/android/export/export.cpp +msgid "" +"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" " +"project setting (changed in Godot 3.2.2).\n" +msgstr "" + +#: platform/android/export/export.cpp +msgid "\"Use Custom Build\" must be enabled to use the plugins." +msgstr "" +"\"Use Custom Build\" debe estar activado para usar estas características " +"adicionais (plugins)." + +#: platform/android/export/export.cpp +msgid "" +"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR" +"\"." +msgstr "" + +#: platform/android/export/export.cpp +msgid "" +"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"." +msgstr "" + +#: platform/android/export/export.cpp +msgid "" +"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"." +msgstr "" + +#: platform/android/export/export.cpp +msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." +msgstr "" + +#: platform/android/export/export.cpp +msgid "Invalid filename! Android App Bundle requires the *.aab extension." +msgstr "" + +#: platform/android/export/export.cpp +msgid "APK Expansion not compatible with Android App Bundle." +msgstr "" + +#: platform/android/export/export.cpp +msgid "Invalid filename! Android APK requires the *.apk extension." +msgstr "" + +#: platform/android/export/export.cpp +msgid "" +"Trying to build from a custom built template, but no version info for it " +"exists. Please reinstall from the 'Project' menu." +msgstr "" + +#: platform/android/export/export.cpp +msgid "" +"Android build version mismatch:\n" +" Template installed: %s\n" +" Godot Version: %s\n" +"Please reinstall Android build template from 'Project' menu." +msgstr "" + +#: platform/android/export/export.cpp +msgid "Building Android Project (gradle)" +msgstr "Construir Proxecto Android (gradle)" + +#: platform/android/export/export.cpp +msgid "" +"Building of Android project failed, check output for the error.\n" +"Alternatively visit docs.godotengine.org for Android build documentation." +msgstr "" +"A creación do proxecto para Android fallou; comproba a saída para encontrar " +"o erro.\n" +"Ou visita docs.godotengine.org para ver a documentación sobre compilación " +"para Android." + +#: platform/android/export/export.cpp +msgid "Moving output" +msgstr "" + +#: platform/android/export/export.cpp +msgid "" +"Unable to copy and rename export file, check gradle project directory for " +"outputs." +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Identifier is missing." +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "The character '%s' is not allowed in Identifier." +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "App Store Team ID not specified - cannot configure the project." +msgstr "" +"ID de App Store Team non especificado - non se pode configurar o proxecto." + +#: platform/iphone/export/export.cpp +msgid "Invalid Identifier:" +msgstr "" + +#: platform/iphone/export/export.cpp +msgid "Required icon is not specified in the preset." +msgstr "" +"As iconas requeridas non están especificadas nos axustes de exportación." + +#: platform/javascript/export/export.cpp +msgid "Stop HTTP Server" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Run in Browser" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Run exported HTML in the system's default browser." +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not write file:" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not open template for export:" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Invalid export template:" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not read custom HTML shell:" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Could not read boot splash image file:" +msgstr "" + +#: platform/javascript/export/export.cpp +msgid "Using default boot splash image." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid package short name." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid package unique name." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid package publisher display name." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid product GUID." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid publisher GUID." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid background color." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid Store Logo image dimensions (should be 50x50)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid square 44x44 logo image dimensions (should be 44x44)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid square 71x71 logo image dimensions (should be 71x71)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid square 150x150 logo image dimensions (should be 150x150)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid square 310x310 logo image dimensions (should be 310x310)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid splash screen image dimensions (should be 620x300)." +msgstr "" + +#: scene/2d/animated_sprite.cpp +msgid "" +"A SpriteFrames resource must be created or set in the \"Frames\" property in " +"order for AnimatedSprite to display frames." +msgstr "" + +#: scene/2d/canvas_modulate.cpp +msgid "" +"Only one visible CanvasModulate is allowed per scene (or set of instanced " +"scenes). The first created one will work, while the rest will be ignored." +msgstr "" + +#: scene/2d/collision_object_2d.cpp +msgid "" +"This node has no shape, so it can't collide or interact with other objects.\n" +"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to " +"define its shape." +msgstr "" +"Este nodo non ten unha forma física definida, polo que non pode colisionar " +"ou interactuar con outros obxectos.\n" +"Engade un nodo CollisionShape2D ou CollisionPolygon2D como fillo para " +"definir a sua forma." + +#: scene/2d/collision_polygon_2d.cpp +msgid "" +"CollisionPolygon2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." +msgstr "" +"O nodo CollisionPolygon2D só serve para darlle unha forma física a nodos " +"derivados de CollisionObject2D. É decir, do tipo Area2D, StaticBody2D, " +"RigidBody2D, KinematicBody2D, etc." + +#: scene/2d/collision_polygon_2d.cpp +msgid "An empty CollisionPolygon2D has no effect on collision." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"CollisionShape2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." +msgstr "" +"O nodo CollisionShape2D só serve para darlle unha forma física a nodos " +"derivados de CollisionObject2D. É decir, do tipo Area2D, StaticBody2D, " +"RigidBody2D, KinematicBody2D, etc." + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"A shape must be provided for CollisionShape2D to function. Please create a " +"shape resource for it!" +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"Polygon-based shapes are not meant be used nor edited directly through the " +"CollisionShape2D node. Please use the CollisionPolygon2D node instead." +msgstr "" +"As formas físicas baseadas en polígonos non están pensadas para editarse " +"directamente mediante o nodo CollisionShape2D. Por favor, usa o nodo " +"CollisionPolygon2D no seu lugar." + +#: scene/2d/cpu_particles_2d.cpp +msgid "" +"CPUParticles2D animation requires the usage of a CanvasItemMaterial with " +"\"Particles Animation\" enabled." +msgstr "" + +#: scene/2d/joints_2d.cpp +msgid "Node A and Node B must be PhysicsBody2Ds" +msgstr "Os nodo A e B teñen que ser do tipo PhysicsBody2D" + +#: scene/2d/joints_2d.cpp +msgid "Node A must be a PhysicsBody2D" +msgstr "O nodo A ten que ser un nodo PhysicsBody2D" + +#: scene/2d/joints_2d.cpp +msgid "Node B must be a PhysicsBody2D" +msgstr "O nodo B ten que ser un nodo PhysicsBody2D" + +#: scene/2d/joints_2d.cpp +msgid "Joint is not connected to two PhysicsBody2Ds" +msgstr "A articulación non está conectada a dous nodos PhysicsBody2D" + +#: scene/2d/joints_2d.cpp +msgid "Node A and Node B must be different PhysicsBody2Ds" +msgstr "Os nodos A e B teñen que ser nodos PhysicsBody2D distintos" + +#: scene/2d/light_2d.cpp +msgid "" +"A texture with the shape of the light must be supplied to the \"Texture\" " +"property." +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "" +"An occluder polygon must be set (or drawn) for this occluder to take effect." +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "The occluder polygon for this occluder is empty. Please draw a polygon." +msgstr "" + +#: scene/2d/navigation_polygon.cpp +msgid "" +"A NavigationPolygon resource must be set or created for this node to work. " +"Please set a property or draw a polygon." +msgstr "" + +#: scene/2d/navigation_polygon.cpp +msgid "" +"NavigationPolygonInstance must be a child or grandchild to a Navigation2D " +"node. It only provides navigation data." +msgstr "" + +#: scene/2d/parallax_layer.cpp +msgid "" +"ParallaxLayer node only works when set as child of a ParallaxBackground node." +msgstr "" + +#: scene/2d/particles_2d.cpp +msgid "" +"GPU-based particles are not supported by the GLES2 video driver.\n" +"Use the CPUParticles2D node instead. You can use the \"Convert to " +"CPUParticles\" option for this purpose." +msgstr "" +"As partículas baseadas na GPU non están soportas por o controlador de vídeo " +"de GLES2.\n" +"Usa o nodo CPUParticles2D no seu lugar. Podes usar a opción \"Converter a " +"CPUParticles\" con tal motivo." + +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." +msgstr "" + +#: scene/2d/particles_2d.cpp +msgid "" +"Particles2D animation requires the usage of a CanvasItemMaterial with " +"\"Particles Animation\" enabled." +msgstr "" + +#: scene/2d/path_2d.cpp +msgid "PathFollow2D only works when set as a child of a Path2D node." +msgstr "" + +#: scene/2d/physics_body_2d.cpp +msgid "" +"Size changes to RigidBody2D (in character or rigid modes) will be overridden " +"by the physics engine when running.\n" +"Change the size in children collision shapes instead." +msgstr "" +"Os cambios ao tamaño do RigidBody2D (en modo ríxido ou modo personaxe) serán " +"sobreescritos por o motor físico cando a aplicación estea executándose.\n" +"Cambia o tamaño dos nodos fillos (CollisionShape2D e CollisionPolygon2D) no " +"seu lugar." + +#: scene/2d/remote_transform_2d.cpp +msgid "Path property must point to a valid Node2D node to work." +msgstr "" + +#: scene/2d/skeleton_2d.cpp +msgid "This Bone2D chain should end at a Skeleton2D node." +msgstr "" + +#: scene/2d/skeleton_2d.cpp +msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node." +msgstr "" + +#: scene/2d/skeleton_2d.cpp +msgid "" +"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one." +msgstr "" + +#: scene/2d/tile_map.cpp +msgid "" +"TileMap with Use Parent on needs a parent CollisionObject2D to give shapes " +"to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, " +"KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp +msgid "" +"VisibilityEnabler2D works best when used with the edited scene root directly " +"as parent." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRCamera must have an ARVROrigin node as its parent." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRController must have an ARVROrigin node as its parent." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "" +"The controller ID must not be 0 or this controller won't be bound to an " +"actual controller." +msgstr "" +"O ID do controlador non pode ser 0, ou o controlador non estará asociado a " +"ningún controlador real." + +#: scene/3d/arvr_nodes.cpp +msgid "ARVRAnchor must have an ARVROrigin node as its parent." +msgstr "" + +#: scene/3d/arvr_nodes.cpp +msgid "" +"The anchor ID must not be 0 or this anchor won't be bound to an actual " +"anchor." +msgstr "" +"O ID da áncora non pode ser 0, ou esta áncora non estará asociada a ningunha " +"áncora real." + +#: scene/3d/arvr_nodes.cpp +msgid "ARVROrigin requires an ARVRCamera child node." +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Finding meshes and lights" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Preparing geometry (%d/%d)" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Preparing environment" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Generating capture" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Saving lightmaps" +msgstr "" + +#: scene/3d/baked_lightmap.cpp +msgid "Done" +msgstr "Feito" + +#: scene/3d/collision_object.cpp +msgid "" +"This node has no shape, so it can't collide or interact with other objects.\n" +"Consider adding a CollisionShape or CollisionPolygon as a child to define " +"its shape." +msgstr "" +"Este nodo non ten unha forma física definida, polo que non pode colisionar " +"ou interactuar con outros obxectos.\n" +"Engade un nodo CollisionShape ou CollisionPolygon como fillo para definir a " +"sua forma." + +#: scene/3d/collision_polygon.cpp +msgid "" +"CollisionPolygon only serves to provide a collision shape to a " +"CollisionObject derived node. Please only use it as a child of Area, " +"StaticBody, RigidBody, KinematicBody, etc. to give them a shape." +msgstr "" +"O nodo CollisionPolygon só serve para darlle unha forma física a nodos " +"derivados de CollisionObject. É decir, do tipo Area, StaticBody, RigidBody, " +"KinematicBody, etc." + +#: scene/3d/collision_polygon.cpp +msgid "An empty CollisionPolygon has no effect on collision." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"CollisionShape only serves to provide a collision shape to a CollisionObject " +"derived node. Please only use it as a child of Area, StaticBody, RigidBody, " +"KinematicBody, etc. to give them a shape." +msgstr "" +"O nodo CollisionShape só serve para darlle unha forma física a nodos " +"derivados de CollisionObject. É decir, do tipo Area, StaticBody, RigidBody, " +"KinematicBody, etc." + +#: scene/3d/collision_shape.cpp +msgid "" +"A shape must be provided for CollisionShape to function. Please create a " +"shape resource for it." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"Plane shapes don't work well and will be removed in future versions. Please " +"don't use them." +msgstr "" + +#: scene/3d/collision_shape.cpp +msgid "" +"ConcavePolygonShape doesn't support RigidBody in another mode than static." +msgstr "" +"A forma física ConcavePolygonShape non está soportada en nodos RigidBody en " +"ningún outro modo que non sexa o estático." + +#: scene/3d/cpu_particles.cpp +msgid "Nothing is visible because no mesh has been assigned." +msgstr "" + +#: scene/3d/cpu_particles.cpp +msgid "" +"CPUParticles animation requires the usage of a SpatialMaterial whose " +"Billboard Mode is set to \"Particle Billboard\"." +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Plotting Meshes" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "Finishing Plot" +msgstr "" + +#: scene/3d/gi_probe.cpp +msgid "" +"GIProbes are not supported by the GLES2 video driver.\n" +"Use a BakedLightmap instead." +msgstr "" + +#: scene/3d/light.cpp +msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." +msgstr "" + +#: scene/3d/navigation_mesh.cpp +msgid "A NavigationMesh resource must be set or created for this node to work." +msgstr "" + +#: scene/3d/navigation_mesh.cpp +msgid "" +"NavigationMeshInstance must be a child or grandchild to a Navigation node. " +"It only provides navigation data." +msgstr "" + +#: scene/3d/particles.cpp +msgid "" +"GPU-based particles are not supported by the GLES2 video driver.\n" +"Use the CPUParticles node instead. You can use the \"Convert to CPUParticles" +"\" option for this purpose." +msgstr "" +"As partículas baseadas na GPU non están soportas por o controlador de vídeo " +"de GLES2.\n" +"Usa o nodo CPUParticles no seu lugar. Podes usar a opción \"Converter a " +"CPUParticles\" con tal motivo." + +#: scene/3d/particles.cpp +msgid "" +"Nothing is visible because meshes have not been assigned to draw passes." +msgstr "" + +#: scene/3d/particles.cpp +msgid "" +"Particles animation requires the usage of a SpatialMaterial whose Billboard " +"Mode is set to \"Particle Billboard\"." +msgstr "" + +#: scene/3d/path.cpp +msgid "PathFollow only works when set as a child of a Path node." +msgstr "" + +#: scene/3d/path.cpp +msgid "" +"PathFollow's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path's Curve resource." +msgstr "" + +#: scene/3d/physics_body.cpp +msgid "" +"Size changes to RigidBody (in character or rigid modes) will be overridden " +"by the physics engine when running.\n" +"Change the size in children collision shapes instead." +msgstr "" +"Os cambios ao tamaño do RigidBody (en modo ríxido ou modo personaxe) serán " +"sobreescritos por o motor físico cando a aplicación estea executándose.\n" +"Cambia o tamaño dos nodos fillos (CollisionShape e CollisionPolygon) no seu " +"lugar." + +#: scene/3d/physics_joint.cpp +msgid "Node A and Node B must be PhysicsBodies" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Node A must be a PhysicsBody" +msgstr "O nodo A ten que ser un nodo PhysicsBody" + +#: scene/3d/physics_joint.cpp +msgid "Node B must be a PhysicsBody" +msgstr "O nodo B ten que ser un nodo PhysicsBody" + +#: scene/3d/physics_joint.cpp +msgid "Joint is not connected to any PhysicsBodies" +msgstr "" + +#: scene/3d/physics_joint.cpp +msgid "Node A and Node B must be different PhysicsBodies" +msgstr "" + +#: scene/3d/remote_transform.cpp +msgid "" +"The \"Remote Path\" property must point to a valid Spatial or Spatial-" +"derived node to work." +msgstr "" + +#: scene/3d/soft_body.cpp +msgid "This body will be ignored until you set a mesh." +msgstr "Este corpo será ignorado ata que se lle sea asignado unha malla." + +#: scene/3d/soft_body.cpp +msgid "" +"Size changes to SoftBody will be overridden by the physics engine when " +"running.\n" +"Change the size in children collision shapes instead." +msgstr "" +"Os cambios ao tamaño do SoftBody serán sobreescritos por o motor físico " +"cando a aplicación estea executándose.\n" +"Cambia o tamaño dos nodos fillos (CollisionShape e CollisionPolygon) no seu " +"lugar." + +#: scene/3d/sprite_3d.cpp +msgid "" +"A SpriteFrames resource must be created or set in the \"Frames\" property in " +"order for AnimatedSprite3D to display frames." +msgstr "" + +#: scene/3d/vehicle_body.cpp +msgid "" +"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use " +"it as a child of a VehicleBody." +msgstr "" +"O nodo VehicleWheel (Roda de Vehículo) serve para proporcionar un sistema de " +"rodas a un nodo VehicleBody. Por favor; úsao como fillo dun nodo VehicleBody." + +#: scene/3d/world_environment.cpp +msgid "" +"WorldEnvironment requires its \"Environment\" property to contain an " +"Environment to have a visible effect." +msgstr "" + +#: scene/3d/world_environment.cpp +msgid "" +"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)." +msgstr "" + +#: scene/3d/world_environment.cpp +msgid "" +"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set " +"this environment's Background Mode to Canvas (for 2D scenes)." +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "On BlendTree node '%s', animation not found: '%s'" +msgstr "" + +#: scene/animation/animation_blend_tree.cpp +msgid "Animation not found: '%s'" +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "In node '%s', invalid animation: '%s'." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Invalid animation: '%s'." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Nothing connected to input '%s' of node '%s'." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "No root AnimationNode for the graph is set." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Path to an AnimationPlayer node containing animations is not set." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." +msgstr "" + +#: scene/animation/animation_tree.cpp +msgid "The AnimationPlayer root node is not a valid node." +msgstr "" + +#: scene/animation/animation_tree_player.cpp +msgid "This node has been deprecated. Use AnimationTree instead." +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "" +"Color: #%s\n" +"LMB: Set color\n" +"RMB: Remove preset" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Pick a color from the editor window." +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "HSV" +msgstr "HSV" + +#: scene/gui/color_picker.cpp +msgid "Raw" +msgstr "Sen Procesar (Raw)" + +#: scene/gui/color_picker.cpp +msgid "Switch between hexadecimal and code values." +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset." +msgstr "" + +#: scene/gui/container.cpp +msgid "" +"Container by itself serves no purpose unless a script configures its " +"children placement behavior.\n" +"If you don't intend to add a script, use a plain Control node instead." +msgstr "" +"Un nodo contedor (Container) por sí mesmo non ten ningunha utilidade, salvo " +"que se lle engada algún Script que configure a colocación dos seus nodos " +"fillos.\n" +"Se non tes pensado engadir un Script, utilizada un nodo Control no seu lugar." + +#: scene/gui/control.cpp +msgid "" +"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to " +"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Alert!" +msgstr "Alerta!" + +#: scene/gui/dialogs.cpp +msgid "Please Confirm..." +msgstr "Por favor, confirma..." + +#: scene/gui/file_dialog.cpp +msgid "Must use a valid extension." +msgstr "" + +#: scene/gui/graph_edit.cpp +msgid "Enable grid minimap." +msgstr "" + +#: scene/gui/popup.cpp +msgid "" +"Popups will hide by default unless you call popup() or any of the popup*() " +"functions. Making them visible for editing is fine, but they will hide upon " +"running." +msgstr "" +"As ventás emerxentes (Popups) están ocultas por defecto, a non ser que " +"chames a popup() ou calquera das funcións popup*(). Podes facelas visibles " +"para editalas, pero ocultarasen ao iniciar a execución." + +#: scene/gui/range.cpp +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." +msgstr "" + +#: scene/gui/scroll_container.cpp +msgid "" +"ScrollContainer is intended to work with a single child control.\n" +"Use a container as child (VBox, HBox, etc.), or a Control and set the custom " +"minimum size manually." +msgstr "" + +#: scene/gui/tree.cpp +msgid "(Other)" +msgstr "(Outros)" + +#: scene/main/scene_tree.cpp +msgid "" +"Default Environment as specified in Project Settings (Rendering -> " +"Environment -> Default Environment) could not be loaded." +msgstr "" + +#: scene/main/viewport.cpp +msgid "" +"This viewport is not set as render target. If you intend for it to display " +"its contents directly to the screen, make it a child of a Control so it can " +"obtain a size. Otherwise, make it a RenderTarget and assign its internal " +"texture to some node for display." +msgstr "" +"Esta Mini-Ventá (Viewport) no está configurada como obxectivo de " +"renderizado. Se quere que o seu contido se mostre directamente na pantalla, " +"convértao nun nodo fillo dun nodo Control para que poida recibir dimensións. " +"Ou ben, fágao un RenderTarget e asigne a súa textura a algún nodo." + +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" +"As dimensións da Mini-Ventá (Viewport) deben de ser maior que 0 para poder " +"renderizar nada." + +#: scene/resources/visual_shader_nodes.cpp +msgid "" +"The sampler port is connected but not used. Consider changing the source to " +"'SamplerPort'." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for preview." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid source for shader." +msgstr "" + +#: scene/resources/visual_shader_nodes.cpp +msgid "Invalid comparison function for that type." +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "Assignment to function." +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "Assignment to uniform." +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "Varyings can only be assigned in vertex function." +msgstr "" + +#: servers/visual/shader_language.cpp +msgid "Constants cannot be modified." +msgstr "" diff --git a/editor/translations/he.po b/editor/translations/he.po index c179d06c24..ab97d97c0a 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -18,12 +18,13 @@ # yariv benj <yariv4400@gmail.com>, 2020. # Guy Dadon <guydadon14@gmail.com>, 2020. # bruvzg <bruvzg13@gmail.com>, 2020. +# Omer I.S. <omeritzicschwartz@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-12-03 19:28+0000\n" -"Last-Translator: Ziv D <wizdavid@gmail.com>\n" +"PO-Revision-Date: 2021-02-21 10:51+0000\n" +"Last-Translator: Omer I.S. <omeritzicschwartz@gmail.com>\n" "Language-Team: Hebrew <https://hosted.weblate.org/projects/godot-engine/" "godot/he/>\n" "Language: he\n" @@ -32,7 +33,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.4-dev\n" +"X-Generator: Weblate 4.5\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -379,9 +380,8 @@ msgid "Anim Insert" msgstr "הוסף הנפשה" #: editor/animation_track_editor.cpp -#, fuzzy msgid "AnimationPlayer can't animate itself, only other players." -msgstr "נגן הנפשות לא יכול להנפיש את עצמו, רק שחקנים אחרים." +msgstr "נגן ההנפשות לא יכול להנפיש את עצמו, רק שחקנים אחרים." #: editor/animation_track_editor.cpp msgid "Anim Create & Insert" @@ -662,7 +662,7 @@ msgstr "בחירת רצועות להעתקה" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "העתקה" @@ -900,9 +900,8 @@ msgid "Connect a Signal to a Method" msgstr "שגיאת חיבור" #: editor/connections_dialog.cpp -#, fuzzy msgid "Edit Connection:" -msgstr "שגיאת חיבור" +msgstr "עריכת חיבור:" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from the \"%s\" signal?" @@ -1102,7 +1101,7 @@ msgstr "דפדפן משאבים יתומים" #: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp #: editor/project_settings_editor.cpp editor/scene_tree_dock.cpp msgid "Delete" -msgstr "למחוק" +msgstr "מחיקה" #: editor/dependency_editor.cpp msgid "Owns" @@ -1194,9 +1193,8 @@ msgid "License" msgstr "רישיון" #: editor/editor_about.cpp -#, fuzzy msgid "Third-party Licenses" -msgstr "רישיון צד שלישי" +msgstr "רשיונות צד שלישי" #: editor/editor_about.cpp msgid "" @@ -1657,9 +1655,8 @@ msgid "Script Editor" msgstr "פתיחת עורך סקריפטים" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Asset Library" -msgstr "ייצוא ספריה" +msgstr "ספריית משאבים" #: editor/editor_feature_profile.cpp msgid "Scene Tree Editing" @@ -1874,8 +1871,8 @@ msgid "Open a File or Directory" msgstr "פתיחת קובץ או תיקייה" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "שמירה" @@ -2532,7 +2529,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "לא ניתן לפתוח את תוסף ההרחבות בנתיב: '%s' פענוח ההגדרות נכשל." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "לא ניתן למצוא שדה סקריפט עבור תוסף הרחבה בנתיב 'res://addons/%s'." #: editor/editor_node.cpp @@ -2952,14 +2950,6 @@ msgid "Help" msgstr "עזרה" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "חיפוש" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "מסמכים מקוונים" @@ -3120,6 +3110,24 @@ msgid "Open & Run a Script" msgstr "פתיחה והרצה של סקריפט" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"הקבצים הבאים הם חדשים בכונן.\n" +"באילו פעולות לנקוט?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "רענון" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "שמירה מחדש" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "חדש בירושה" @@ -3328,7 +3336,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "הדבקה" @@ -4047,6 +4055,21 @@ msgstr "" msgid "Saving..." msgstr "שמירה…" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "נא לבחור מפרקים לייצוא" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "ייבוא" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "טעינת בררת המחדל" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d קבצים" @@ -5030,7 +5053,8 @@ msgid "Got:" msgstr "התקבל:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "בדיקת האש sha256 נכשלה" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5134,7 +5158,6 @@ msgid "Sort:" msgstr "מיון:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "קטגוריה:" @@ -5498,9 +5521,8 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp -#, fuzzy msgid "Zoom Reset" -msgstr "להתרחק" +msgstr "איפוס התקריב" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6987,6 +7009,14 @@ msgstr "סגירת מסמכים" msgid "Run" msgstr "הרצה" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "חיפוש" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "לצעוד לתוך" @@ -7042,16 +7072,6 @@ msgstr "" "הקבצים הבאים הם חדשים בכונן.\n" "באילו פעולות לנקוט?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "רענון" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "שמירה מחדש" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "ניפוי שגיאות" @@ -7150,8 +7170,8 @@ msgstr "מחיקת נקודות" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "גזירה" @@ -7278,13 +7298,12 @@ msgid "Go to Previous Breakpoint" msgstr "מעבר לנקודת העצירה הקודמת" #: editor/plugins/shader_editor_plugin.cpp -#, fuzzy msgid "" "This shader has been modified on on disk.\n" "What action should be taken?" msgstr "" "הקבצים הבאים הם חדשים בכונן.\n" -"באילו פעולות לנקוט?:" +"באילו פעולות לנקוט?" #: editor/plugins/shader_editor_plugin.cpp msgid "Shader" @@ -7392,6 +7411,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -10053,6 +10076,13 @@ msgid "Projects" msgstr "מיזם" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "" +"הקבצים נסרקים,\n" +"נא להמתין…" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10423,6 +10453,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "טעינת בררת המחדל" + #: editor/property_editor.cpp msgid "Preset..." msgstr "ערכה מוגדרת…" @@ -10682,6 +10717,16 @@ msgid "Instance Child Scene" msgstr "יצירת מופע לסצנה הצאצאית" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "לא יכול לפעול על מפרקים מסצנה זרה!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "הדבקת מפרקים" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "ניתוק סקריפט" @@ -10805,6 +10850,11 @@ msgid "Attach Script" msgstr "חיבור סקריפט" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "גזירת מפרקים" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "הסרת מפרק(ים)" @@ -12439,6 +12489,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "ל־CollisionPolygon2D ריק אין השפעה על התנגשות." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12736,11 +12794,6 @@ msgstr "" "מנהל הווידאו GLES2 אינו תומך ב- GIProbes.\n" "השתמש ב-BakedLightmap במקום." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "SpotLight עם זווית רחבה מ-90 מעלות אינו יכול להטיל צללים." diff --git a/editor/translations/hi.po b/editor/translations/hi.po index fbf1352eff..034451542b 100644 --- a/editor/translations/hi.po +++ b/editor/translations/hi.po @@ -649,7 +649,7 @@ msgstr "कॉपी करने के लिए ट्रैक का चय #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "कॉपी" @@ -1852,8 +1852,8 @@ msgid "Open a File or Directory" msgstr "फ़ाइल या डायरेक्टरी खोलिये" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "सेव कीजिये" @@ -2518,7 +2518,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "ऐडऑन प्लगइन को सक्षम करने में असमर्थ: '%' कॉन्फिग का पार्सिंग विफल रहा।" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "ऐडऑन प्लगइन के लिए स्क्रिप्ट फ़ील्ड खोजने में असमर्थ: 'res://addons/% s'।" #: editor/editor_node.cpp @@ -2946,14 +2947,6 @@ msgid "Help" msgstr "मदद" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "ढूंढें" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "ऑनलाइन डॉक्स" @@ -3117,6 +3110,23 @@ msgid "Open & Run a Script" msgstr "ओपन एंड रन एक स्क्रिप्ट" #: editor/editor_node.cpp +#, fuzzy +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "निम्न फ़ाइलों का निस्सारण नहीं हो पाया:" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "नई विरासत में मिली" @@ -3324,7 +3334,7 @@ msgstr "अद्वितीय बनाओ" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "चिपकाएँ" @@ -4025,6 +4035,21 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "आयात करने के लिए नोड (एस) का चयन करें" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "इंपोर्ट" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "प्रायिक लोड कीजिये" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4972,7 +4997,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5076,7 +5101,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6863,6 +6887,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "ढूंढें" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6914,16 +6946,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -7020,8 +7042,8 @@ msgstr "एक नया बनाएं" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7244,6 +7266,11 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Size" +msgstr "आकार: " + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9834,6 +9861,11 @@ msgid "Projects" msgstr "परियोजना के संस्थापक" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "दर्पण को पुनः प्राप्त करना, कृपया प्रतीक्षा करें ..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10196,6 +10228,11 @@ msgstr "" msgid "Plugins" msgstr "प्लगइन्स" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "प्रायिक लोड कीजिये" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10441,6 +10478,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "प्रतिलिपि" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "नई स्क्रिप्ट" @@ -10567,6 +10613,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "प्रतिलिपि" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -12185,6 +12236,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12442,11 +12501,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/hr.po b/editor/translations/hr.po index 9826f61488..047363db63 100644 --- a/editor/translations/hr.po +++ b/editor/translations/hr.po @@ -631,7 +631,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopiraj" @@ -1812,8 +1812,8 @@ msgid "Open a File or Directory" msgstr "Otvori datoteku ili direktorij" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Spremi" @@ -2447,7 +2447,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2837,14 +2837,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -2998,6 +2990,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3200,7 +3208,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3885,6 +3893,21 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Odaberi Sve/Ništa" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Uvoz" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Učitaj Zadano" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Fajlovi" @@ -4832,7 +4855,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4936,7 +4959,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6703,6 +6725,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6754,16 +6784,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -6856,8 +6876,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7078,6 +7098,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9611,6 +9635,10 @@ msgid "Projects" msgstr "" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -9971,6 +9999,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Učitaj Zadano" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10214,6 +10247,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Brisati odabrani ključ/odabrane ključeve" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Odspoji Skriptu" @@ -10334,6 +10376,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -11917,6 +11963,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12172,11 +12226,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/hu.po b/editor/translations/hu.po index 78db184f7d..3966959f91 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -663,7 +663,7 @@ msgstr "Másolandó nyomvonalak kiválasztása" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Másolás" @@ -1855,8 +1855,8 @@ msgid "Open a File or Directory" msgstr "Fájl vagy Könyvtár Megnyitása" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Mentés" @@ -2530,7 +2530,8 @@ msgstr "" "megbukott." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Nem található szkript mező az addon pluginnak a következő helyen: 'res://" "addons/%s'." @@ -2970,14 +2971,6 @@ msgid "Help" msgstr "Súgó" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Keresés" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Online Dokumentáció" @@ -3133,6 +3126,25 @@ msgid "Open & Run a Script" msgstr "Szkriptet Megnyit és Futtat" #: editor/editor_node.cpp +#, fuzzy +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"A alábbi fájlok újabbak a lemezen.\n" +"Mit szeretne lépni?:" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Újratöltés" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Újramentés" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Új Örökölt" @@ -3335,7 +3347,7 @@ msgstr "Egyedivé tétel" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Beillesztés" @@ -4035,6 +4047,21 @@ msgstr "" msgid "Saving..." msgstr "Mentés..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Kiválasztó Mód" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importálás" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Alapértelmezett Betöltése" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d fájl" @@ -4993,7 +5020,8 @@ msgid "Got:" msgstr "Kapott:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "sha256 hash ellenőrzés megbukott" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5097,7 +5125,6 @@ msgid "Sort:" msgstr "Rendezés:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategória:" @@ -6904,6 +6931,14 @@ msgstr "Dokumentációs Lapok Bezárása" msgid "Run" msgstr "Futtatás" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Keresés" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Belépés" @@ -6957,16 +6992,6 @@ msgstr "" "A alábbi fájlok újabbak a lemezen.\n" "Mit szeretne lépni?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Újratöltés" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Újramentés" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Hibakereső" @@ -7059,8 +7084,8 @@ msgstr "Töréspontok" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Kivágás" @@ -7282,6 +7307,11 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Size" +msgstr "Méret: " + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "Rajzolt objektumok" @@ -9831,6 +9861,11 @@ msgid "Projects" msgstr "Projektek" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "Tükrök letöltése, kérjük várjon..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10194,6 +10229,11 @@ msgstr "" msgid "Plugins" msgstr "Bővítmények" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Alapértelmezett Betöltése" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Beépített Beállítások..." @@ -10438,6 +10478,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Node-ok beillesztése" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Szkript leválasztása" @@ -10558,6 +10607,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Node-ok kivágása" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -12152,6 +12206,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12412,11 +12474,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/id.po b/editor/translations/id.po index b7dc29eb20..5dc5b9751a 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -28,12 +28,13 @@ # Richard Urban <redasuio1@gmail.com>, 2020. # yusuf afandi <afandi.yusuf.04@gmail.com>, 2020. # Habib Rohman <revolusi147id@gmail.com>, 2020. +# Hanz <hanzhaxors@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-11-13 22:59+0000\n" -"Last-Translator: Habib Rohman <revolusi147id@gmail.com>\n" +"PO-Revision-Date: 2021-03-08 15:33+0000\n" +"Last-Translator: Hanz <hanzhaxors@gmail.com>\n" "Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/" "godot/id/>\n" "Language: id\n" @@ -41,7 +42,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.4-dev\n" +"X-Generator: Weblate 4.5.1\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -57,7 +58,8 @@ msgstr "String dengan panjang 1 (karakter) yang diharapkan." #: 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 "Tidak cukup bytes untuk mendekode bytes, atau format tidak valid." +msgstr "" +"Tidak cukup bytes untuk merubah bytes ke nilai asal, atau format tidak valid." #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" @@ -65,8 +67,7 @@ msgstr "Masukkan tidak sah %i (tidak diberikan) dalam ekspresi" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "" -"self tidak dapat digunakan karena tidak memiliki instance (tidak lolos)" +msgstr "self tidak dapat digunakan karena instance adalah null" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -74,7 +75,7 @@ msgstr "operan salah untuk operator %s, %s dan %s." #: core/math/expression.cpp msgid "Invalid index of type %s for base type %s" -msgstr "Tipe index %s tidak valid untuk tipe dasar %s" +msgstr "Tipe indeks %s tidak valid untuk tipe dasar %s" #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" @@ -671,7 +672,7 @@ msgstr "Pilih Trek untuk Disalin" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopy" @@ -1052,14 +1053,14 @@ msgid "Owners Of:" msgstr "Pemilik Dari:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Remove selected files from the project? (no undo)\n" "You can find the removed files in the system trash to restore them." -msgstr "Hapus berkas yang dipilih dari proyek? (tidak bisa dibatalkan)" +msgstr "" +"Hapus berkas yang dipilih dari proyek? (tidak bisa dibatalkan)\n" +"Anda bisa menemukan berkas yang telah dihapus di tong sampah." #: editor/dependency_editor.cpp -#, fuzzy msgid "" "The files being removed are required by other resources in order for them to " "work.\n" @@ -1068,7 +1069,8 @@ msgid "" msgstr "" "File-file yang telah dihapus diperlukan oleh resource lain agar mereka dapat " "bekerja.\n" -"Hapus saja? (tidak bisa dibatalkan/undo)" +"Hapus saja? (tidak bisa dibatalkan)\n" +"Anda bisa menemukan berkas yang telah dihapus di tong sampah." #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -1621,34 +1623,31 @@ msgstr "" "Enabled'." #: editor/editor_export.cpp -#, fuzzy msgid "" "Target platform requires 'PVRTC' texture compression for GLES2. Enable " "'Import Pvrtc' in Project Settings." msgstr "" -"Platform target membutuhkan kompresi tekstur 'ETC' untuk GLES2. Aktifkan " -"'Impor Lainnya' di Pengaturan Proyek." +"Platform target membutuhkan kompresi tekstur 'PVRTC' untuk GLES2. Aktifkan " +"'Impor Pvrtc' di Pengaturan Proyek." #: editor/editor_export.cpp -#, fuzzy msgid "" "Target platform requires 'ETC2' or 'PVRTC' texture compression for GLES3. " "Enable 'Import Etc 2' or 'Import Pvrtc' in Project Settings." msgstr "" -"Platform target membutuhkan kompresi tekstur 'ETC2' untuk GLES3. Aktifkan " -"'Impor Lainnya 2' di Pengaturan Proyek." +"Platform target membutuhkan kompresi tekstur 'ETC2' atau 'PVRTC' untuk " +"GLES3. Aktifkan 'Impor Lainnya 2' atau 'Import Pvrtc' di Pengaturan Proyek." #: editor/editor_export.cpp -#, fuzzy msgid "" "Target platform requires 'PVRTC' texture compression for the driver fallback " "to GLES2.\n" "Enable 'Import Pvrtc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" -"Platform target membutuhkan kompressi tekstur 'ETC' untuk mengembalikan " +"Platform target membutuhkan kompressi tekstur 'PVRTC' untuk mengembalikan " "driver ke GLES2. \n" -"Aktifkan 'Impor Lainnya' di Pengaturan Proyek, atau matikan 'Driver Fallback " +"Aktifkan 'Impor Pvrtc' di Pengaturan Proyek, atau matikan 'Driver Fallback " "Enabled'." #: editor/editor_export.cpp platform/android/export/export.cpp @@ -1877,8 +1876,8 @@ msgid "Open a File or Directory" msgstr "Buka sebuah File atau Direktori" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Simpan" @@ -2330,6 +2329,8 @@ msgid "" "An error occurred while trying to save the editor layout.\n" "Make sure the editor's user data path is writable." msgstr "" +"Terjadi kesalahan ketika mencoba menyimpan layout editor.\n" +"Pastikan jalur data pengguna editor dapat ditulis." #: editor/editor_node.cpp msgid "" @@ -2337,13 +2338,15 @@ msgid "" "To restore the Default layout to its base settings, use the Delete Layout " "option and delete the Default layout." msgstr "" +"Penataan editor default telah dirubah.\n" +"Untuk mengembalikan penataan editor default ke asalnya, gunakan opsi Hapus " +"Penataan dan hapus Penataan Default." #: editor/editor_node.cpp msgid "Layout name not found!" msgstr "Nama layout tidak ditemukan!" #: editor/editor_node.cpp -#, fuzzy msgid "Restored the Default layout to its base settings." msgstr "Mengembalikan semula layout default ke pengaturan-pengaturan awal." @@ -2402,7 +2405,7 @@ msgstr "Tidak ada skena yang didefinisikan untuk dijalankan." #: editor/editor_node.cpp msgid "Save scene before running..." -msgstr "" +msgstr "Simpan skena sebelum menjalankan..." #: editor/editor_node.cpp msgid "Could not start subprocess!" @@ -2481,7 +2484,6 @@ msgid "Reload Saved Scene" msgstr "Muat ulang scene yang sudah disimpan" #: editor/editor_node.cpp -#, fuzzy msgid "" "The current scene has unsaved changes.\n" "Reload the saved scene anyway? This action cannot be undone." @@ -2548,9 +2550,9 @@ msgstr "" "gagal." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" -"Tidak dapat mencari bidang script untuk addon plugin pada: 'res://addons/%s'." +"Tidak dapat mencari bidang skrip untuk addon plugin pada: 'res://addons/%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2854,12 +2856,10 @@ msgstr "" "lokal." #: editor/editor_node.cpp -#, fuzzy msgid "Small Deploy with Network Filesystem" -msgstr "Deploy Kecil dengan Jaringan FS" +msgstr "Deploy Kecil dengan Jaringan Berkas" #: editor/editor_node.cpp -#, fuzzy msgid "" "When this option is enabled, using one-click deploy for Android will only " "export an executable without the project data.\n" @@ -2868,9 +2868,9 @@ msgid "" "On Android, deploying will use the USB cable for faster performance. This " "option speeds up testing for projects with large assets." msgstr "" -"Ketika opsi ini aktif, ekspor atau deploy akan menghasilkan minimal " -"executable.\n" -"Berkas sistem akan tersedia dari proyek dari editor melalui jaringan.\n" +"Ketika opsi ini aktif, menggunakan 'one-click deploy' hanya akan mengekspor " +"executable tanpa data proyek.\n" +"Berkas sistem akan tersedia dari proyek oleh editor melalui jaringan.\n" "Pada Android, deploy akan menggunakan kabel USB untuk performa yang lebih " "cepat. Opsi ini mempercepat pengujian dengan jejak kaki yang besar." @@ -2879,34 +2879,29 @@ msgid "Visible Collision Shapes" msgstr "Collision Shapes Terlihat" #: editor/editor_node.cpp -#, fuzzy msgid "" "When this option is enabled, collision shapes and raycast nodes (for 2D and " "3D) will be visible in the running project." msgstr "" "Collision shapes dan raycast nodes (untuk 2D dan 3D) akan terlihat pada saat " -"permainan berjalan jika opsi ini aktif." +"proyek berjalan jika opsi ini aktif." #: editor/editor_node.cpp msgid "Visible Navigation" msgstr "Navigasi Terlihat" #: editor/editor_node.cpp -#, fuzzy msgid "" "When this option is enabled, navigation meshes and polygons will be visible " "in the running project." msgstr "" -"Navigasi meshes dan poligon akan terlihat saat game berjalan jika opsi ini " -"aktif." +"Navigasi dan poligon akan terlihat saat game berjalan jika opsi ini aktif." #: editor/editor_node.cpp -#, fuzzy msgid "Synchronize Scene Changes" msgstr "Sinkronkan Perubahan Skena" #: editor/editor_node.cpp -#, fuzzy msgid "" "When this option is enabled, any changes made to the scene in the editor " "will be replicated in the running project.\n" @@ -2914,17 +2909,15 @@ msgid "" "filesystem option is enabled." msgstr "" "Ketika opsi ini aktif, perubahan yang dibuat pada skena melalui editor akan " -"direplika pada gim yang sedang berjalan.\n" +"direplika pada proyek yang sedang berjalan.\n" "Ketika penggunaan remote pada sebuah perangkat, akan lebih efisien dengan " -"berkas sistem jaringan." +"opsi berkas sistem jaringan." #: editor/editor_node.cpp -#, fuzzy msgid "Synchronize Script Changes" -msgstr "Sinkronkan Perubahan Script" +msgstr "Sinkronkan Perubahan skrip" #: editor/editor_node.cpp -#, fuzzy msgid "" "When this option is enabled, any script that is saved will be reloaded in " "the running project.\n" @@ -2933,8 +2926,8 @@ msgid "" msgstr "" "Ketika opsi ini aktif, perubahan script yang tersimpan akan di muat kembali " "pada permainan yang sedang berjalan.\n" -"Ketika penggunaan remote pada sebuah perngakat, akan lebih efisien jika " -"jaringan filesystem." +"Ketika penggunaan remote pada sebuah perangakat, akan lebih efisien dengan " +"opsi jaringan berkas-berkas." #: editor/editor_node.cpp editor/script_create_dialog.cpp msgid "Editor" @@ -2989,14 +2982,6 @@ msgid "Help" msgstr "Bantuan" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Cari" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Online Dokumentasi" @@ -3161,6 +3146,24 @@ msgid "Open & Run a Script" msgstr "Buka & Jalankan Skrip" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"Berkas berikut lebih baru dalam disk.\n" +"Aksi apa yang ingin diambil?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Muat Ulang" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Simpan Ulang" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Turunan Baru" @@ -3372,7 +3375,7 @@ msgstr "Jadikan Unik" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Tempel" @@ -3410,7 +3413,6 @@ msgid "Add Key/Value Pair" msgstr "Tambahkan pasangan Key/Value" #: editor/editor_run_native.cpp -#, fuzzy msgid "" "No runnable export preset found for this platform.\n" "Please add a runnable preset in the Export menu or define an existing preset " @@ -3444,11 +3446,10 @@ msgid "Did you forget the '_run' method?" msgstr "Apakah anda lupa dengan fungsi '_run' ?" #: editor/editor_spin_slider.cpp -#, fuzzy msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes." msgstr "" -"Tahan Ctrl untuk meletakkan Getter. Tahan Shift untuk meletakkan generic " -"signature." +"Tahan Ctrl untuk membulatkan bilangan. Tahan Shift untuk meletakkan bilangan " +"yang lebih presisi." #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" @@ -3732,6 +3733,11 @@ msgid "" "\n" "Do you wish to overwrite them?" msgstr "" +"file dan/atau berkas-berkas berikut mempunyai konflik di '%s':\n" +"\n" +"%s\n" +"\n" +"Apakah Anda ingin melanjutkan (overwrite)?" #: editor/filesystem_dock.cpp msgid "Renaming file:" @@ -3763,7 +3769,7 @@ msgstr "Buka Skena" #: editor/filesystem_dock.cpp msgid "Instance" -msgstr "Instansi" +msgstr "hal" #: editor/filesystem_dock.cpp msgid "Add to Favorites" @@ -3812,9 +3818,8 @@ msgid "Duplicate..." msgstr "Gandakan..." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Move to Trash" -msgstr "Pindahkan Autoload" +msgstr "Pindahkan ke tong sampah" #: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Rename..." @@ -3925,12 +3930,10 @@ msgid "Searching..." msgstr "Mencari..." #: editor/find_in_files.cpp -#, fuzzy msgid "%d match in %d file." msgstr "Ditemukan %d kecocokan." #: editor/find_in_files.cpp -#, fuzzy msgid "%d matches in %d file." msgstr "Ditemukan %d kecocokan." @@ -4073,6 +4076,21 @@ msgstr "" msgid "Saving..." msgstr "Menyimpan..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Mode Seleksi" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Impor" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Muat Default" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Berkas" @@ -5036,7 +5054,8 @@ msgid "Got:" msgstr "Yang Didapat:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Gagal mengecek hash sha256" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5140,7 +5159,6 @@ msgid "Sort:" msgstr "Sortir:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategori:" @@ -6975,6 +6993,14 @@ msgstr "Tutup Dokumentasi" msgid "Run" msgstr "Jalankan" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Cari" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Masuki" @@ -7028,16 +7054,6 @@ msgstr "" "Berkas berikut lebih baru dalam diska.\n" "Aksi apa yang ingin diambil?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Muat Ulang" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Simpan Ulang" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Pengawakutu" @@ -7135,8 +7151,8 @@ msgstr "Breakpoint" msgid "Go To" msgstr "Pergi Ke" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Potong" @@ -7360,6 +7376,11 @@ msgid "Yaw" msgstr "Oleng" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Size" +msgstr "Ukuran: " + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "Objek Digambar" @@ -10053,6 +10074,11 @@ msgid "Projects" msgstr "Proyek" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "Mendapatkan informasi cermin, silakan tunggu..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "Terakhir Diubah" @@ -10423,6 +10449,11 @@ msgstr "Muat Otomatis" msgid "Plugins" msgstr "Pengaya" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Muat Default" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Prasetel..." @@ -10678,6 +10709,16 @@ msgstr "Instansi Skena Anak" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Tidak dapat bekerja pada node dari skena luar!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Rekatkan Node" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Detach Script" msgstr "Lampirkan Skrip" @@ -10808,6 +10849,11 @@ msgid "Attach Script" msgstr "Lampirkan Skrip" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Potong Node" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Hapus Node" @@ -12468,6 +12514,14 @@ msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" "Sebuah CollisionPolygon2D yang kosong tidak memiliki efek pada collision." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12788,11 +12842,6 @@ msgstr "" "GIProbes tidak didukung oleh driver video GLES2.\n" "Gunakan BakedLightmap sebagai gantinya." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/is.po b/editor/translations/is.po index 88dbd92927..8d36556c04 100644 --- a/editor/translations/is.po +++ b/editor/translations/is.po @@ -659,7 +659,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1835,8 +1835,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -2472,7 +2472,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2865,14 +2865,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3027,6 +3019,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3230,7 +3238,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3915,6 +3923,19 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Afrita val" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4876,7 +4897,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4980,7 +5001,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6763,6 +6783,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6814,16 +6842,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -6916,8 +6934,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7139,6 +7157,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9703,6 +9725,10 @@ msgid "Projects" msgstr "Verkefna Stjóri" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10065,6 +10091,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10309,6 +10339,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Tvíteknir lyklar" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10433,6 +10472,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Tvíteknir lyklar" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -12022,6 +12066,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12277,11 +12329,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/it.po b/editor/translations/it.po index f322366f4f..67b524937c 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -50,17 +50,18 @@ # J. Lavoie <j.lavoie@net-c.ca>, 2020. # Andrea Terenziani <andrea.terenziani.at@gmail.com>, 2020. # Anonymous <noreply@weblate.org>, 2020. -# riccardo boffelli <riccardo.boffelli.96@gmail.com>, 2020. +# riccardo boffelli <riccardo.boffelli.96@gmail.com>, 2020, 2021. # Lorenzo Asolan <brixiumx@gmail.com>, 2020. -# Lorenzo Cerqua <lorenzocerqua@tutanota.com>, 2020. +# Lorenzo Cerqua <lorenzocerqua@tutanota.com>, 2020, 2021. # Federico Manzella <ferdiu.manzella@gmail.com>, 2020. # Ziv D <wizdavid@gmail.com>, 2020. +# Riteo Siuga <lorenzocerqua@tutanota.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-01-22 10:21+0000\n" -"Last-Translator: Micila Micillotto <micillotto@gmail.com>\n" +"PO-Revision-Date: 2021-03-10 22:14+0000\n" +"Last-Translator: riccardo boffelli <riccardo.boffelli.96@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" "Language: it\n" @@ -68,7 +69,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 4.5-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -191,7 +192,7 @@ msgstr "Elimina delle chiavi d'animazione" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Time" -msgstr "Cambia Intervallo Fotogramma Principale Animazione" +msgstr "Cambia il tempo di un fotogramma chiave" #: editor/animation_track_editor.cpp msgid "Anim Change Transition" @@ -203,7 +204,7 @@ msgstr "Cambia la trasformazione di un'animazione" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Value" -msgstr "Cambia Valore Fotogramma Principale Animazione" +msgstr "Cambia il valore del fotogramma chiave di un'animazione" #: editor/animation_track_editor.cpp msgid "Anim Change Call" @@ -211,32 +212,32 @@ msgstr "Cambia la chiamata di un'animazione" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Time" -msgstr "Cambia Multipli Intervalli Fotogramma Principale Animazione" +msgstr "Cambia il tempo di più fotogrammi chiave" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Transition" -msgstr "Cambi Multipli Transizione Animazione" +msgstr "Cambia la transizione di più animazioni" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Transform" -msgstr "Cambi Multipli Trasformazione Animazione" +msgstr "Cambia le trasformazioni di più animazioni" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Value" -msgstr "Cambia Multipli Valori Fotogramma Principale Animazione" +msgstr "Cambia il valore di più fotogrammi chiave di un'Animazione" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Call" -msgstr "Cambi Multipli Chiamata Animazione" +msgstr "Cambia la chiamata di metodo di più animazioni" #: editor/animation_track_editor.cpp msgid "Change Animation Length" -msgstr "Cambia Lunghezza Animazione" +msgstr "Cambia la durata dell'animazione" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation Loop" -msgstr "Cambia Loop Animazione" +msgstr "Commuta ciclicità animazione" #: editor/animation_track_editor.cpp msgid "Property Track" @@ -293,7 +294,7 @@ msgstr "Clip animazione:" #: editor/animation_track_editor.cpp msgid "Change Track Path" -msgstr "Cambia il percorso della traccia" +msgstr "Cambia Percorso Traccia" #: editor/animation_track_editor.cpp msgid "Toggle this track on/off." @@ -309,7 +310,7 @@ msgstr "Modalità d'interpolazione" #: editor/animation_track_editor.cpp msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" -msgstr "Modalità Ciclo ad Anello (interpola la fine con l'inizio a ciclo)" +msgstr "Modalità ciclo ad anello (interpola la fine con l'inizio del ciclo)" #: editor/animation_track_editor.cpp msgid "Remove this track." @@ -333,7 +334,7 @@ msgstr "Discreta" #: editor/animation_track_editor.cpp msgid "Trigger" -msgstr "Attivatore" +msgstr "Attivazione" #: editor/animation_track_editor.cpp msgid "Capture" @@ -354,24 +355,24 @@ msgstr "Cubica" #: editor/animation_track_editor.cpp msgid "Clamp Loop Interp" -msgstr "Blocca Interpolazione Ciclo" +msgstr "Blocca l'interpolazione d'un ciclo" #: editor/animation_track_editor.cpp msgid "Wrap Loop Interp" -msgstr "Avvolgi Interpolazione Ciclo" +msgstr "Continua l'interpolazione d'un ciclo" #: editor/animation_track_editor.cpp #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key" -msgstr "Inserisci Fotogramma Chiave" +msgstr "Inserisci un fotogramma chiave" #: editor/animation_track_editor.cpp msgid "Duplicate Key(s)" -msgstr "Duplica Fotogrammi Chiave Selezionati" +msgstr "Duplica i fotogrammi chiave selezionati" #: editor/animation_track_editor.cpp msgid "Delete Key(s)" -msgstr "Elimina Fotogrammi Chiave Selezionati" +msgstr "Elimina i fotogrammi chiave selezionati" #: editor/animation_track_editor.cpp msgid "Change Animation Update Mode" @@ -383,15 +384,16 @@ msgstr "Cambia la modalità d'interpolazione di un'animazione" #: editor/animation_track_editor.cpp msgid "Change Animation Loop Mode" -msgstr "Cambia la modalità del ciclo di un'animazione" +msgstr "Cambia Modalità Loop Animazione" #: editor/animation_track_editor.cpp msgid "Remove Anim Track" -msgstr "Rimuovi la traccia di un'animazione" +msgstr "Rimuovi una traccia d'animazione" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Create NEW track for %s and insert key?" -msgstr "Crea NUOVA traccia per %s ed inserire fotogramma chiave?" +msgstr "Creare una NUOVA traccia per %s e inserirci la chiave?" #: editor/animation_track_editor.cpp msgid "Create %d NEW tracks and insert keys?" @@ -473,15 +475,15 @@ msgstr "Non è possibile aggiungere una nuova traccia senza un nodo radice" #: editor/animation_track_editor.cpp msgid "Invalid track for Bezier (no suitable sub-properties)" -msgstr "Traccia non valida per la curva Bézier (nessuna sottoproprietà adatta)" +msgstr "Traccia non valida per Bezier (nessuna sotto-proprietà valida)" #: editor/animation_track_editor.cpp msgid "Add Bezier Track" -msgstr "Aggiungi traccia Bézier" +msgstr "Aggiungi una traccia di curve di Bézier" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a key." -msgstr "Il tracciato non è valido, non è possibile aggiungere una chiave." +msgstr "La traccia non è valida, quindi è impossibile aggiungere una chiave." #: editor/animation_track_editor.cpp msgid "Track is not of type Spatial, can't insert key" @@ -489,21 +491,21 @@ msgstr "La traccia non è di tipo Spatial, impossibile aggiungere la chiave" #: editor/animation_track_editor.cpp msgid "Add Transform Track Key" -msgstr "Aggiungi chiave traccia Transform" +msgstr "Aggiungi una chiave a una traccia di trasformazioni" #: editor/animation_track_editor.cpp msgid "Add Track Key" -msgstr "Aggiungi chiave traccia" +msgstr "Aggiungi una chiave a una traccia" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a method key." msgstr "" -"Il tracciato non è valido, non è possibile aggiungere una chiave di chiamata " -"di funzione." +"La traccia non è valida, quindi, non è stato possibile aggiungere una chiave " +"chiamata metodo." #: editor/animation_track_editor.cpp msgid "Add Method Track Key" -msgstr "Aggiungi chiave alla traccia metodo" +msgstr "Aggiungi una chiave a una traccia di chiamate di metodi" #: editor/animation_track_editor.cpp msgid "Method not found in object: " @@ -511,7 +513,7 @@ msgstr "Metodo non trovato nell'oggetto: " #: editor/animation_track_editor.cpp msgid "Anim Move Keys" -msgstr "Sposta chiavi animazione" +msgstr "Sposta delle chiavi d'animazione" #: editor/animation_track_editor.cpp msgid "Clipboard is empty" @@ -519,18 +521,18 @@ msgstr "Gli appunti sono vuoti" #: editor/animation_track_editor.cpp msgid "Paste Tracks" -msgstr "Incolla tracce" +msgstr "Incolla Tracce" #: editor/animation_track_editor.cpp msgid "Anim Scale Keys" -msgstr "Scala chiavi animazione" +msgstr "Scala Chiavi Animazione" #: editor/animation_track_editor.cpp msgid "" "This option does not work for Bezier editing, as it's only a single track." msgstr "" -"Questa opzione non funziona per modificare curve di Bézier, dato che si " -"tratta di una traccia singola." +"Questa opzione non funziona per modificare delle curve di Bézier, dato che " +"si tratta di una singola traccia." #: editor/animation_track_editor.cpp msgid "" @@ -544,14 +546,14 @@ msgid "" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" -"Questa animazione appartiene a una scena importata, eventuali modifiche alle " -"tracce importate non saranno salvate.\n" +"Questa animazione appartiene ad una scena importata, quindi i cambiamenti " +"alle tracce importate non saranno salvate.\n" "\n" -"Per abilitare la possibilità di aggiungere ulteriori tracce, vai alle " -"impostazioni di importazione della scena e imposta\n" -"\"Animation > Storage\" su \"Files\", abilita \"Animation > Keep Custom " -"Tracks\", e infine reimporta la scena.\n" -"Altrimenti, usa un preset di importazione che importa le animazioni in file " +"Per abilitare l'aggiunta di tracce personalizzate, naviga alle impostazioni " +"d'importazione della scena ed imposta\n" +"\"Animation > Storage\" a \"Files\", abilita \"Animation > Keep Custom Tracks" +"\", e poi re-importa.\n" +"In alternativa, usa un preset d'importo che importa le animazioni da file " "separati." #: editor/animation_track_editor.cpp @@ -568,11 +570,11 @@ msgstr "Mostra solo le tracce dei nodi selezionati nell'albero." #: editor/animation_track_editor.cpp msgid "Group tracks by node or display them as plain list." -msgstr "Raggruppa le tracce per nodo o mostra una lista semplice." +msgstr "Raggruppa le tracce per nodo o le visualizza in una lista semplice." #: editor/animation_track_editor.cpp msgid "Snap:" -msgstr "Snap:" +msgstr "Scatto:" #: editor/animation_track_editor.cpp msgid "Animation step value." @@ -599,27 +601,27 @@ msgstr "Modifica" #: editor/animation_track_editor.cpp msgid "Animation properties." -msgstr "Proprietà animazione." +msgstr "Proprietà dell'animazione." #: editor/animation_track_editor.cpp msgid "Copy Tracks" -msgstr "Copia tracce" +msgstr "Copia le tracce" #: editor/animation_track_editor.cpp msgid "Scale Selection" -msgstr "Scala selezione" +msgstr "Scala la selezione" #: editor/animation_track_editor.cpp msgid "Scale From Cursor" -msgstr "Scala da cursore" +msgstr "Scala a partire dal cursore" #: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp msgid "Duplicate Selection" -msgstr "Duplica selezione" +msgstr "Duplica la selezione" #: editor/animation_track_editor.cpp msgid "Duplicate Transposed" -msgstr "Duplica trasposto" +msgstr "Duplica Trasposto" #: editor/animation_track_editor.cpp msgid "Delete Selection" @@ -627,19 +629,19 @@ msgstr "Elimina la selezione" #: editor/animation_track_editor.cpp msgid "Go to Next Step" -msgstr "Va' al passo successivo" +msgstr "Vai allo Step Successivo" #: editor/animation_track_editor.cpp msgid "Go to Previous Step" -msgstr "Va' al passo precedente" +msgstr "Vai allo Step Precedente" #: editor/animation_track_editor.cpp msgid "Optimize Animation" -msgstr "Ottimizza animazione" +msgstr "Ottimizza l'animazione" #: editor/animation_track_editor.cpp msgid "Clean-Up Animation" -msgstr "Pulisci animazione" +msgstr "Pulisci l'animazione" #: editor/animation_track_editor.cpp msgid "Pick the node that will be animated:" @@ -647,7 +649,7 @@ msgstr "Seleziona il nodo che verrà animato:" #: editor/animation_track_editor.cpp msgid "Use Bezier Curves" -msgstr "Usa curve di Bézier" +msgstr "Usa le curve di Bézier" #: editor/animation_track_editor.cpp msgid "Anim. Optimizer" @@ -655,15 +657,15 @@ msgstr "Ottimizzatore anim." #: editor/animation_track_editor.cpp msgid "Max. Linear Error:" -msgstr "Max. errore lineare:" +msgstr "Max Errore Lineare:" #: editor/animation_track_editor.cpp msgid "Max. Angular Error:" -msgstr "Max. errore angolare:" +msgstr "Max Errore Angolare:" #: editor/animation_track_editor.cpp msgid "Max Optimizable Angle:" -msgstr "Max. angolo ottimizzabile:" +msgstr "Max Angolo Ottimizzabile:" #: editor/animation_track_editor.cpp msgid "Optimize" @@ -671,11 +673,11 @@ msgstr "Ottimizza" #: editor/animation_track_editor.cpp msgid "Remove invalid keys" -msgstr "Rimuovi chiavi non valide" +msgstr "Rimuovi le chiavi non valide" #: editor/animation_track_editor.cpp msgid "Remove unresolved and empty tracks" -msgstr "Rimuovi tracce irrisolte e vuote" +msgstr "Rimuovi le tracce irrisolte e vuote" #: editor/animation_track_editor.cpp msgid "Clean-up all animations" @@ -683,7 +685,7 @@ msgstr "Pulisci tutte le animazioni" #: editor/animation_track_editor.cpp msgid "Clean-Up Animation(s) (NO UNDO!)" -msgstr "Pulisci animazione(i) (NON ANNULLABILE!)" +msgstr "Pulisci le animazioni (NON ANNULLABILE!)" #: editor/animation_track_editor.cpp msgid "Clean-Up" @@ -702,45 +704,45 @@ msgstr "Seleziona le tracce da copiare" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Copia" #: editor/animation_track_editor.cpp msgid "Select All/None" -msgstr "Seleziona Tutto/Nulla" +msgstr "De/Seleziona Tutto" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" -msgstr "Aggiungi traccia clip audio" +msgstr "Aggiungi audio in una traccia di riproduzione audio" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" -msgstr "Cambia Offset di Inizio della Clip della Traccia Audio" +msgstr "Cambia Offset Inizio Clip Traccia Audio" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip End Offset" -msgstr "Cambia offset di fine della clip della traccia audio" +msgstr "Cambia Offset Fine Clip Traccia Audio" #: editor/array_property_edit.cpp msgid "Resize Array" -msgstr "Ridimensiona array" +msgstr "Ridimensiona Array" #: editor/array_property_edit.cpp msgid "Change Array Value Type" -msgstr "Cambia tipo del valore dell'array" +msgstr "Cambia Tipo Valore Array" #: editor/array_property_edit.cpp msgid "Change Array Value" -msgstr "Cambia valore array" +msgstr "Cambia Valore Array" #: editor/code_editor.cpp msgid "Go to Line" -msgstr "Vai alla linea" +msgstr "Vai alla Linea" #: editor/code_editor.cpp msgid "Line Number:" -msgstr "Numero linea:" +msgstr "Numero Linea:" #: editor/code_editor.cpp msgid "%d replaced." @@ -752,15 +754,15 @@ msgstr "%d corrispondenza." #: editor/code_editor.cpp editor/editor_help.cpp msgid "%d matches." -msgstr "%d corrispondenza/e." +msgstr "%d corrispondenze." #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Match Case" -msgstr "Distingui maiuscole" +msgstr "Distingui Maiuscole" #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Whole Words" -msgstr "Parole intere" +msgstr "Parole Intere" #: editor/code_editor.cpp msgid "Replace" @@ -768,11 +770,11 @@ msgstr "Sostituisci" #: editor/code_editor.cpp msgid "Replace All" -msgstr "Rimpiazza tutti" +msgstr "Rimpiazza Tutti" #: editor/code_editor.cpp msgid "Selection Only" -msgstr "Solo selezione" +msgstr "Solo Selezione" #: editor/code_editor.cpp editor/plugins/script_text_editor.cpp #: editor/plugins/text_editor.cpp @@ -781,7 +783,7 @@ msgstr "Standard" #: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp msgid "Toggle Scripts Panel" -msgstr "Commuta pannello degli script" +msgstr "Toggle Pannello Script" #: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp @@ -797,23 +799,23 @@ msgstr "Rimpicciolisci" #: editor/code_editor.cpp msgid "Reset Zoom" -msgstr "Resetta ingrandimento" +msgstr "Reimposta ingrandimento" #: editor/code_editor.cpp msgid "Warnings" -msgstr "Avvertenze" +msgstr "Avvisi" #: editor/code_editor.cpp msgid "Line and column numbers." -msgstr "Numeri di riga e colonna." +msgstr "Numeri di riga e di colonna." #: editor/connections_dialog.cpp msgid "Method in target node must be specified." -msgstr "Il metodo del nodo designato deve essere specificato." +msgstr "Il metodo del nodo selezionato deve essere specificato." #: editor/connections_dialog.cpp msgid "Method name must be a valid identifier." -msgstr "Il nome del metodo dev'essere un identificatore valido." +msgstr "Il nome del metodo deve essere un identificatore valido." #: editor/connections_dialog.cpp msgid "" @@ -1911,8 +1913,8 @@ msgid "Open a File or Directory" msgstr "Apri un file o una cartella" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Salva" @@ -2592,10 +2594,9 @@ msgstr "" "configurazione fallita." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" -"Impossibile trovare il campo dello script per il componente aggiuntivo in: " -"'res://addons/%s'." +"Impossibile trovare il campo script per il plugin addon in posizione: '%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -3031,14 +3032,6 @@ msgid "Help" msgstr "Aiuto" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Cerca" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Documentazione online" @@ -3164,13 +3157,13 @@ msgid "" "the \"Use Custom Build\" option should be enabled in the Android export " "preset." msgstr "" -"Questo imposterà il tuo progetto per le build custom per Android, " -"installando i source templates in \"res://android/build\".\n" -"Puoi, allora, applicare le modifiche e costruire il tuo APK custom durante " -"l'esportazione (aggiungere moduli, cambiare il AndroidManifest.xml, ed " -"altro).\n" -"Nota che, in ordine per creare le build custom invece di usare gli APK pre-" -"costruiti, l'opzione \"Use Custom Build\" sarà abilitata nel preset " +"Questo predisporrà il progetto per le build personalizzate per Android " +"installando i template sorgente in \"res://android/build\".\n" +"Potrai allora applicare le modifiche e costruire il tuo APK personalizzato " +"durante l'esportazione (aggiungere moduli, cambiare l'AndroidManifest.xml, " +"eccetera).\n" +"Nota che per creare delle build personalizzate, invece di usare gli APK pre-" +"costruiti, l'opzione \"Use Custom Build\" va attivata nella preimpostazione " "d'esportazione per Android." #: editor/editor_node.cpp @@ -3180,30 +3173,48 @@ msgid "" "Remove the \"res://android/build\" directory manually before attempting this " "operation again." msgstr "" -"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 " +"Il template della build Android è già installato in questo progetto e non " +"verrà sovrascritto.\n" +"Rimuovi manualmente la cartella \"res://android/build\" prima di ritentare " "questa operazione." #: editor/editor_node.cpp msgid "Import Templates From ZIP File" -msgstr "Importa template da un file ZIP" +msgstr "Importa Template Da File ZIP" #: editor/editor_node.cpp msgid "Template Package" -msgstr "Pacchetto Modello" +msgstr "Pacchetto Template" #: editor/editor_node.cpp msgid "Export Library" -msgstr "Esporta libreria" +msgstr "Esporta Libreria" #: editor/editor_node.cpp msgid "Merge With Existing" -msgstr "Unisci con esistente" +msgstr "Unisci Con Esistente" #: editor/editor_node.cpp msgid "Open & Run a Script" -msgstr "Apri ed esegui uno script" +msgstr "Apri ed Esegui uno Script" + +#: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"I seguenti file sono più recenti sul disco.\n" +"Quale azione dovrebbe essere presa?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Ricarica" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Risalva" #: editor/editor_node.cpp msgid "New Inherited" @@ -3416,7 +3427,7 @@ msgstr "Rendi Unico" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Incolla" @@ -4123,6 +4134,20 @@ msgstr "" msgid "Saving..." msgstr "Salvataggio..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Modalità di selezione" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importare" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "Ripristinare le impostazioni predefinite" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d File" @@ -5095,8 +5120,8 @@ msgid "Got:" msgstr "Ottenuto:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" -msgstr "Check hash sha256 fallito" +msgid "Failed SHA-256 hash check" +msgstr "Check has SHA-256 fallito" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5199,7 +5224,6 @@ msgid "Sort:" msgstr "Ordina:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Categoria:" @@ -7039,6 +7063,14 @@ msgstr "Chiudi la documentazione" msgid "Run" msgstr "Esegui" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Cerca" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Passo dentro all'istruzione" @@ -7092,16 +7124,6 @@ msgstr "" "I file seguenti sono più recenti su disco.\n" "Che azione deve essere intrapresa?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Ricarica" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Risalva" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Debugger" @@ -7197,8 +7219,8 @@ msgstr "Punti di interruzione" msgid "Go To" msgstr "Vai a" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Taglia" @@ -7421,6 +7443,10 @@ msgid "Yaw" msgstr "Imbardata" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "Dimensione" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "Oggetti disegnati" @@ -10121,6 +10147,10 @@ msgid "Projects" msgstr "Progetti" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "Caricamento, per favore attendere..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "Ultima Modifica" @@ -10491,6 +10521,10 @@ msgstr "AutoLoad" msgid "Plugins" msgstr "Plugins" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "Carica Predefiniti" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Preset…" @@ -10741,6 +10775,14 @@ msgid "Instance Child Scene" msgstr "Istanzia Scena Figlia" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "Non si può incollare il noto root nella stessa scena." + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "Incolla Nodo(i)" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Rimuovi Script" @@ -10867,6 +10909,10 @@ msgid "Attach Script" msgstr "Allega Script" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "Taglia Nodo(i)" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Rimuovi nodo(i)" @@ -12545,6 +12591,18 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Un CollisionPolygon2D vuoto non ha effetti sulla collisione." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" +"Poligono non valido. Sono necessari almeno 3 punti nella modalità di " +"costruzione 'Solidi'." + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" +"Poligono non valido. Sono necessari almeno 2 punti nella modalità di " +"costruzione 'Segmenti'." + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12869,11 +12927,6 @@ msgstr "" "Le GIProbes non sono supportate dal driver video GLES2.\n" "In alternativa, usa una BakedLightmap." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "\"InterpolatedCamera\" è stata deprecata e sarà rimossa in Godot 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13132,9 +13185,9 @@ msgid "" "functions. Making them visible for editing is fine, but they will hide upon " "running." msgstr "" -"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." +"I popup saranno nascosti di default finchè non chiami popup(), o una delle " +"qualsiasi funzioni popup*(). Farli diventare visibili per modificarli va " +"bene, ma scompariranno durante l'esecuzione." #: scene/gui/range.cpp msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." @@ -13217,6 +13270,11 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Le constanti non possono essere modificate." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "" +#~ "\"InterpolatedCamera\" è stata deprecata e sarà rimossa in Godot 4.0." + #~ msgid "No" #~ msgstr "No" @@ -14880,9 +14938,6 @@ msgstr "Le constanti non possono essere modificate." #~ msgid "Use Default Light" #~ msgstr "Usa Luce Default" -#~ msgid "Use Default sRGB" -#~ msgstr "Usa sRGB Default" - #~ msgid "Default Light Normal:" #~ msgstr "Normale Luce di Default:" diff --git a/editor/translations/ja.po b/editor/translations/ja.po index 917587952a..8afa2de349 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -31,12 +31,12 @@ # Akihiro Ogoshi <technical@palsystem-game.com>, 2019, 2020. # Wataru Onuki <bettawat@yahoo.co.jp>, 2020, 2021. # sporeball <sporeballdev@gmail.com>, 2020. -# BinotaLIU <me@binota.org>, 2020. +# BinotaLIU <me@binota.org>, 2020, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-01-22 10:21+0000\n" +"PO-Revision-Date: 2021-03-08 15:33+0000\n" "Last-Translator: Wataru Onuki <bettawat@yahoo.co.jp>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot/ja/>\n" @@ -45,12 +45,12 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.5.1\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Invalid type argument to convert(), use TYPE_* constants." -msgstr "convert() の引数の型が無効です。TYPE_* 定数を使ってください。" +msgstr "convert() の引数の型が無効です。TYPE_* 定数を使用してください。" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." @@ -676,7 +676,7 @@ msgstr "コピーするトラックを選択" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "コピー" @@ -1590,7 +1590,7 @@ msgstr "ファイルの保存:" #: editor/editor_export.cpp msgid "No export template found at the expected path:" -msgstr "エクスポート テンプレートが予想されたパスに見つかりません:" +msgstr "エクスポート テンプレートが予期されたパスに見つかりません:" #: editor/editor_export.cpp msgid "Packing" @@ -1881,8 +1881,8 @@ msgid "Open a File or Directory" msgstr "ファイルまたはディレクトリを開く" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "保存" @@ -2554,10 +2554,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "アドオンプラグインを有効にできません: '%s' 設定の解析に失敗しました。" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "" -"アドオンプラグインのスクリプトフィールドが 'res://addons/%s' から見つかりませ" -"ん。" +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "アドオンプラグインのスクリプトフィールドが '%s' で見つかりません。" #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2988,14 +2986,6 @@ msgid "Help" msgstr "ヘルプ" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "検索" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "オンラインドキュメント" @@ -3161,6 +3151,24 @@ msgid "Open & Run a Script" msgstr "スクリプトを開いて実行" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"以下のファイルより新しいものがディスク上に存在します。\n" +"どうしますか?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "再読込" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "再保存" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "新規の継承" @@ -3371,7 +3379,7 @@ msgstr "ユニーク化" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "貼り付け" @@ -4071,6 +4079,21 @@ msgstr "" msgid "Saving..." msgstr "保存中..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "選択モード" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "インポート" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "デフォルトを読込む" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d ファイル" @@ -5035,8 +5058,8 @@ msgid "Got:" msgstr "取得:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" -msgstr "sha256 ハッシュチェック失敗" +msgid "Failed SHA-256 hash check" +msgstr "SHA-256 ハッシュチェック失敗" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5139,7 +5162,6 @@ msgid "Sort:" msgstr "ソート:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "カテゴリー:" @@ -6962,6 +6984,14 @@ msgstr "ドキュメントを閉じる" msgid "Run" msgstr "実行" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "検索" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "ステップイン" @@ -7015,16 +7045,6 @@ msgstr "" "以下のファイルより新しいものがディスク上に存在します。\n" "どうしますか?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "再読込" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "再保存" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "デバッガ" @@ -7121,8 +7141,8 @@ msgstr "ブレークポイント" msgid "Go To" msgstr "参照" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "切り取り" @@ -7345,6 +7365,10 @@ msgid "Yaw" msgstr "ヨー" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "サイズ" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "描画されたオブジェクト" @@ -10021,6 +10045,10 @@ msgid "Projects" msgstr "プロジェクト" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "読み込み中、しばらくお待ちください..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "最終更新" @@ -10391,6 +10419,11 @@ msgstr "自動読み込み" msgid "Plugins" msgstr "プラグイン" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "デフォルトを読込む" + #: editor/property_editor.cpp msgid "Preset..." msgstr "プリセット..." @@ -10640,6 +10673,14 @@ msgid "Instance Child Scene" msgstr "子シーンをインスタンス化" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "ルートノードは同じシーンに貼り付けできません。" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "ノードを貼り付け" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "スクリプトをデタッチ" @@ -10765,6 +10806,10 @@ msgid "Attach Script" msgstr "スクリプトをアタッチ" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "ノードを切り取り" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "ノードを除去" @@ -10836,7 +10881,7 @@ msgstr "親ノードを新規ノードに変更" #: editor/scene_tree_dock.cpp msgid "Make Scene Root" -msgstr "シーンをルートにする" +msgstr "シーンのルートにする" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" @@ -11581,24 +11626,20 @@ msgid "Preparing data structures" msgstr "データ構造の準備" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Generate buffers" -msgstr "AABBを生成" +msgstr "バッファを生成" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Direct lighting" -msgstr "方向" +msgstr "直接光" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Indirect lighting" -msgstr "右インデント" +msgstr "間接光" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Post processing" -msgstr "ポストプロセス" +msgstr "後処理" #: modules/lightmapper_cpu/lightmapper_cpu.cpp #, fuzzy @@ -12119,9 +12160,8 @@ msgid "Select device from the list" msgstr "一覧からデバイスを選択" #: platform/android/export/export.cpp -#, fuzzy msgid "Unable to find the 'apksigner' tool." -msgstr "zipalign ツールが見つかりません。" +msgstr "'apksigner' ツールが見つかりません。" #: platform/android/export/export.cpp msgid "" @@ -12140,14 +12180,12 @@ msgid "Release keystore incorrectly configured in the export preset." msgstr "エクスポート設定にてリリース キーストアが誤って設定されています。" #: platform/android/export/export.cpp -#, fuzzy msgid "A valid Android SDK path is required in Editor Settings." -msgstr "エディタ設定のカスタムビルドのAndroid SDKパスが無効です。" +msgstr "エディタ設定でAndroid SDKパスの指定が必要です。" #: platform/android/export/export.cpp -#, fuzzy msgid "Invalid Android SDK path in Editor Settings." -msgstr "エディタ設定のカスタムビルドのAndroid SDKパスが無効です。" +msgstr "エディタ設定のAndroid SDKパスが無効です。" #: platform/android/export/export.cpp msgid "Missing 'platform-tools' directory!" @@ -12155,12 +12193,11 @@ msgstr "'platform-tools' ディレクトリがありません!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK platform-tools' adb command." -msgstr "" +msgstr "Android SDK platform-toolsのadbコマンドが見つかりません。" #: platform/android/export/export.cpp -#, fuzzy msgid "Please check in the Android SDK directory specified in Editor Settings." -msgstr "エディタ設定のカスタムビルドのAndroid SDKパスが無効です。" +msgstr "エディタ設定で指定されたAndroid SDKのディレクトリを確認してください。" #: platform/android/export/export.cpp msgid "Missing 'build-tools' directory!" @@ -12168,7 +12205,7 @@ msgstr "'build-tools' ディレクトリがありません!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK build-tools' apksigner command." -msgstr "" +msgstr "Android SDK build-toolsのapksignerコマンドが見つかりません。" #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." @@ -12432,6 +12469,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "空の CollisionPolygon2D は、衝突判定を持ちません。" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12645,9 +12690,8 @@ msgid "Finding meshes and lights" msgstr "" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing geometry (%d/%d)" -msgstr "ジオメトリを解析しています..." +msgstr "ジオメトリを解析しています (%d/%d)" #: scene/3d/baked_lightmap.cpp #, fuzzy @@ -12754,11 +12798,6 @@ msgstr "" "GIProbesはGLES2ビデオドライバではサポートされていません。\n" "代わりにBakedLightmapを使用してください。" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera は廃止予定であり、Godot 4.0で除去されます。" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "90度を超える角度のスポットライトは、シャドウを投影できません。" @@ -13097,6 +13136,10 @@ msgstr "Varying変数は頂点関数にのみ割り当てることができま msgid "Constants cannot be modified." msgstr "定数は変更できません。" +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "InterpolatedCamera は廃止予定であり、Godot 4.0で除去されます。" + #~ msgid "No" #~ msgstr "いいえ" diff --git a/editor/translations/ka.po b/editor/translations/ka.po index c35aebac02..6828baf211 100644 --- a/editor/translations/ka.po +++ b/editor/translations/ka.po @@ -675,7 +675,7 @@ msgstr "დაყენდეს გადასვლები შემდე #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1900,8 +1900,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -2552,7 +2552,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2949,14 +2949,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3111,6 +3103,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3316,7 +3324,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4020,6 +4028,19 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "წავშალოთ მონიშნული ფაილები?" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4998,7 +5019,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5105,7 +5126,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6918,6 +6938,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6969,16 +6997,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -7078,8 +7096,8 @@ msgstr "შექმნა" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7307,6 +7325,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9908,6 +9930,11 @@ msgid "Projects" msgstr "პროექტის დამფუძნებლები" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "ძებნა:" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10272,6 +10299,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10519,6 +10550,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "ანიმაციის გასაღებების ასლის შექმნა" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "დამოკიდებულებების შემსწორებელი" @@ -10645,6 +10685,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "ანიმაციის გასაღებების ასლის შექმნა" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -12266,6 +12311,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12521,11 +12574,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/ko.po b/editor/translations/ko.po index 8c15195d24..693b726ebf 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -16,7 +16,7 @@ # Jiyoon Kim <kimjiy@dickinson.edu>, 2019. # Ervin <zetsmart@gmail.com>, 2019. # Tilto_ <tilto0822@develable.xyz>, 2020. -# Myeongjin Lee <aranet100@gmail.com>, 2020. +# Myeongjin Lee <aranet100@gmail.com>, 2020, 2021. # Doyun Kwon <caen4516@gmail.com>, 2020. # Jun Hyung Shin <shmishmi79@gmail.com>, 2020. # Yongjin Jo <wnrhd114@gmail.com>, 2020. @@ -25,8 +25,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-10-31 23:15+0000\n" -"Last-Translator: Yungjoong Song <yungjoong.song@gmail.com>\n" +"PO-Revision-Date: 2021-03-12 09:17+0000\n" +"Last-Translator: Myeongjin Lee <aranet100@gmail.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot/ko/>\n" "Language: ko\n" @@ -34,7 +34,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.3.2-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -662,7 +662,7 @@ msgstr "복사할 트랙 선택" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "복사" @@ -704,7 +704,7 @@ msgstr "행 번호:" #: editor/code_editor.cpp msgid "%d replaced." -msgstr "%d개가 바뀌었습니다." +msgstr "%d개 찾아 바꿈." #: editor/code_editor.cpp editor/editor_help.cpp msgid "%d match." @@ -1044,22 +1044,23 @@ msgid "Owners Of:" msgstr "소유자:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Remove selected files from the project? (no undo)\n" "You can find the removed files in the system trash to restore them." -msgstr "프로젝트에서 선택한 파일을 삭제할까요? (되돌릴 수 없습니다)" +msgstr "" +"프로젝트에서 선택된 파일을 제거하시겠습니다? (되돌릴 수 없음)\n" +"시스템 휴지통에서 제거된 파일을 찾고 복원할 수 있습니다." #: editor/dependency_editor.cpp -#, fuzzy msgid "" "The files being removed are required by other resources in order for them to " "work.\n" "Remove them anyway? (no undo)\n" "You can find the removed files in the system trash to restore them." msgstr "" -"삭제하려는 파일은 다른 리소스가 동작하기 위해 필요한 파일입니다.\n" -"무시하고 삭제할까요? (되돌릴 수 없습니다)" +"제거하려는 파일은 다른 리소스가 동작하기 위해 필요합니다.\n" +"무시하고 제거하시겠습니까? (되돌릴 수 없음)\n" +"시스템 휴지통에서 제거된 파일을 찾고 복원할 수 있습니다." #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -1864,8 +1865,8 @@ msgid "Open a File or Directory" msgstr "디렉토리 또는 파일 열기" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "저장" @@ -2314,6 +2315,8 @@ msgid "" "An error occurred while trying to save the editor layout.\n" "Make sure the editor's user data path is writable." msgstr "" +"편집기 레이아웃의 저장을 하려는 동안 오류가 발생했습니다.\n" +"편집기의 사용자 데이터 경로가 쓰기 가능한지 확인해주세요." #: editor/editor_node.cpp msgid "" @@ -2321,15 +2324,17 @@ msgid "" "To restore the Default layout to its base settings, use the Delete Layout " "option and delete the Default layout." msgstr "" +"기본 편집기 레이아웃이 덮어 쓰여져 있습니디.\n" +"기본 레이아웃을 원래 설정으로 복구하려면, 레이아웃 삭제 옵션을 사용하여 기본 " +"레이아웃을 삭제하세요." #: editor/editor_node.cpp msgid "Layout name not found!" msgstr "레이아웃 이름을 찾을 수 없습니다!" #: editor/editor_node.cpp -#, fuzzy msgid "Restored the Default layout to its base settings." -msgstr "기본 레이아웃을 초기화하였습니다." +msgstr "기본 레이아웃을 원래 설정으로 복구하였습니다." #: editor/editor_node.cpp msgid "" @@ -2384,7 +2389,7 @@ msgstr "실행할 씬이 설정되지 않았습니다." #: editor/editor_node.cpp msgid "Save scene before running..." -msgstr "" +msgstr "씬을 실행하기 전에 저장..." #: editor/editor_node.cpp msgid "Could not start subprocess!" @@ -2507,8 +2512,8 @@ msgid "" "This option is deprecated. Situations where refresh must be forced are now " "considered a bug. Please report." msgstr "" -"이 설정은 제거되었습니다. 강제로 새로고침해야 하는 상황은 이제 버그입니다. 신" -"고해주세요." +"이 옵션은 사용되지 않습니다. 강제로 새로 고침해야 하는 상황은 이제 버그로 간" +"주됩니다. 신고해주세요." #: editor/editor_node.cpp msgid "Pick a Main Scene" @@ -2529,8 +2534,9 @@ msgstr "" "실패했습니다." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "다음 경로에서 애드온 플러그인을 찾을 수 없음: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "" +"다음 경로에서 애드온 플러그인을 위한 스크립트 필드를 찾을 수 없습니다: '%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2893,17 +2899,16 @@ msgid "Synchronize Script Changes" msgstr "스크립트 변경사항 동기화" #: editor/editor_node.cpp -#, fuzzy msgid "" "When this option is enabled, any script that is saved will be reloaded in " "the running project.\n" "When used remotely on a device, this is more efficient when the network " "filesystem option is enabled." msgstr "" -"이 설정이 활성화된 경우, 어떤 스크립트든 저장하면 실행중인 게임에도 새로고침" -"되어 반영됩니다.\n" -"원격 장치에서 사용중인 경우 네트워크 파일 시스템 기능을 활성화하면 더욱 효율" -"적입니다." +"이 옵션이 활성화된 경우, 어떤 스크립트든지 저장되면 실행 중인 프로젝트를 다" +"시 불러오게 됩니다.\n" +"기기에서 원격으로 사용 중인 경우, 네트워크 파일 시스템 옵션이 활성화되어 있다" +"면 더욱 효율적입니다." #: editor/editor_node.cpp editor/script_create_dialog.cpp msgid "Editor" @@ -2958,14 +2963,6 @@ msgid "Help" msgstr "도움말" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "검색" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "온라인 문서" @@ -3127,6 +3124,24 @@ msgid "Open & Run a Script" msgstr "스크립트 열기 & 실행" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"다음 파일은 디스크에 있는 게 더 최신입니다.\n" +"조치을 어떻게 취해야 합니까?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "새로고침" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "다시 저장" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "새 상속 씬" @@ -3335,7 +3350,7 @@ msgstr "유일하게 만들기" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "붙여넣기" @@ -3373,14 +3388,14 @@ msgid "Add Key/Value Pair" msgstr "키/값 쌍 추가" #: editor/editor_run_native.cpp -#, fuzzy msgid "" "No runnable export preset found for this platform.\n" "Please add a runnable preset in the Export menu or define an existing preset " "as runnable." msgstr "" -"이 플랫폼으로 실행할 수 있는 내보내기 프리셋이 없습니다.\n" -"내보내기 메뉴에서 실행할 수 있는 프리셋을 추가해주세요." +"이 플랫폼을 위한 실행할 수 있는 내보내기 프리셋이 없습니다.\n" +"내보내기 메뉴에서 실행할 수 있는 프리셋을 추가하거나 기존 프리셋을 실행할 수 " +"있도록 지정해주세요." #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." @@ -3693,6 +3708,11 @@ msgid "" "\n" "Do you wish to overwrite them?" msgstr "" +"다음 파일이나 폴더가 대상 위치 '%s'의 항목과 충돌합니다:\n" +"\n" +"%s\n" +"\n" +"이를 덮어쓰시겠습니까?" #: editor/filesystem_dock.cpp msgid "Renaming file:" @@ -3773,9 +3793,8 @@ msgid "Duplicate..." msgstr "복제..." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Move to Trash" -msgstr "오토로드 이동" +msgstr "휴지통으로 이동" #: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Rename..." @@ -3886,19 +3905,16 @@ msgid "Searching..." msgstr "검색 중..." #: editor/find_in_files.cpp -#, fuzzy msgid "%d match in %d file." -msgstr "%d개 일치." +msgstr "파일 %d$2개 중 %d$1개 일치." #: editor/find_in_files.cpp -#, fuzzy msgid "%d matches in %d file." -msgstr "%d개 일치." +msgstr "파일 %d$2개 중 %d$1개 일치." #: editor/find_in_files.cpp -#, fuzzy msgid "%d matches in %d files." -msgstr "%d개 일치." +msgstr "파일 %d$2개 중 %d$1개 일치." #: editor/groups_editor.cpp msgid "Add to Group" @@ -4034,6 +4050,18 @@ msgstr "`post_import()` 메소드에서 Node에서 상속받은 객체를 반환 msgid "Saving..." msgstr "저장 중..." +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "임포터 선택" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "임포터:" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "기본값으로 재설정" + #: editor/import_dock.cpp msgid "%d Files" msgstr "파일 %d개" @@ -4997,8 +5025,8 @@ msgid "Got:" msgstr "받음:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" -msgstr "sha256 해시 확인 실패" +msgid "Failed SHA-256 hash check" +msgstr "SHA-256 해시 확인 실패" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5101,7 +5129,6 @@ msgid "Sort:" msgstr "정렬:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "카테고리:" @@ -5130,14 +5157,12 @@ msgid "Assets ZIP File" msgstr "애셋 ZIP 파일" #: editor/plugins/baked_lightmap_editor_plugin.cpp -#, fuzzy msgid "" "Can't determine a save path for lightmap images.\n" "Save your scene and try again." msgstr "" -"라이트맵 이미지의 저장 경로를 파악할 수 없습니다.\n" -"(같은 경로에 이미지를 저장할 수 있도록) 씬을 저장하거나, BakedLightmap 속성에" -"서 저장 경로를 지정하세요." +"라이트맵 이미지를 위한 저장 경로를 결정할 수 없습니다.\n" +"당신의 씬을 저장하고 다시 시도하세요." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" @@ -5154,26 +5179,30 @@ msgstr "라이트맵 이미지 생성 실패. 작성 가능한 경로인지 확 #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed determining lightmap size. Maximum lightmap size too small?" msgstr "" +"라이트맵 크기를 결정하는 데 실패했습니다. 최대 라이트맵 크기가 너무 작나요?" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" "Some mesh is invalid. Make sure the UV2 channel values are contained within " "the [0.0,1.0] square region." msgstr "" +"일부 메시가 잘못되었습니다. UV2 채널 값이 [0.0,1.0] 정사각형 영역 안에 포함되" +"어 있는지 확인해주세요." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" "Godot editor was built without ray tracing support, lightmaps can't be baked." msgstr "" +"Godot 편집기가 레이 트레이싱 지원 없이 빌드되어 있어, 라이트맵이 구워질 수 없" +"습니다." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Bake Lightmaps" msgstr "라이트맵 굽기" #: editor/plugins/baked_lightmap_editor_plugin.cpp -#, fuzzy msgid "Select lightmap bake file:" -msgstr "템플릿 파일 선택" +msgstr "라이트맵을 구울 파일 선택:" #: editor/plugins/camera_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5242,50 +5271,43 @@ msgstr "수평 및 수직 가이드 만들기" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Set CanvasItem \"%s\" Pivot Offset to (%d, %d)" -msgstr "CanvasItem \"%s\" Pivot Offset (%d, %d)로 설정" +msgstr "CanvasItem \"%s\"의 피벗 오프셋을 (%d, %d)로 설정" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Rotate %d CanvasItems" -msgstr "CanvasItem 회전" +msgstr "CanvasItem %d개 회전" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Rotate CanvasItem \"%s\" to %d degrees" -msgstr "CanvasItem 회전" +msgstr "CanvasItem \"%s\"를 %d도로 회전" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move CanvasItem \"%s\" Anchor" -msgstr "CanvasItem 이동" +msgstr "CanvasItem \"%s\" 앵커 이동" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale Node2D \"%s\" to (%s, %s)" -msgstr "" +msgstr "Node2D \"%s\"를 (%s, %s)로 크기 조절" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Resize Control \"%s\" to (%d, %d)" -msgstr "" +msgstr "컨트롤 \"%s\"를 (%d, %d)로 크기 조절" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Scale %d CanvasItems" -msgstr "CanvasItem 규모" +msgstr "CanvasItem %d개 크기 조절" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Scale CanvasItem \"%s\" to (%s, %s)" -msgstr "CanvasItem 규모" +msgstr "CanvasItem \"%s\"를 (%s, %s)로 크기 조절" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move %d CanvasItems" -msgstr "CanvasItem 이동" +msgstr "CanvasItem %d개 이동" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move CanvasItem \"%s\" to (%d, %d)" -msgstr "CanvasItem 이동" +msgstr "CanvasItem \"%s\"를 (%d, %d)로 이동" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -5491,7 +5513,7 @@ msgstr "회전모드" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Mode" -msgstr "크기조절 모드" +msgstr "크기 조절 모드" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5540,7 +5562,7 @@ msgstr "회전 스냅 사용" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Scale Snap" -msgstr "스마트 스냅 사용" +msgstr "크기 조절 스냅 사용" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" @@ -5658,11 +5680,11 @@ msgstr "선택 항목 중앙으로" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Frame Selection" -msgstr "선택 항목 전체 화면으로" +msgstr "프레임 선택" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Preview Canvas Scale" -msgstr "캔버스 규모 미리 보기" +msgstr "캔버스 크기 조절 미리 보기" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Translation mask for inserting keys." @@ -5924,7 +5946,7 @@ msgstr "기울기 편집됨" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" -msgstr "항목 %d" +msgstr "항목 %d개" #: editor/plugins/item_list_editor_plugin.cpp msgid "Items" @@ -6264,9 +6286,8 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "ParticlesMaterial 프로세스 머티리얼 안에만 점을 설정할 수 있습니다" #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Convert to CPUParticles2D" -msgstr "CPU파티클로 변환" +msgstr "CPUParticles2D로 변환" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp @@ -6554,18 +6575,16 @@ msgid "Move Points" msgstr "점 이동" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Command: Rotate" -msgstr "드래그: 회전" +msgstr "Command: 회전" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Shift: Move All" msgstr "Shift: 모두 이동" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Shift+Command: Scale" -msgstr "Shift+Ctrl: 크기 조절" +msgstr "Shift+Command: 크기 조절" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Ctrl: Rotate" @@ -6612,14 +6631,12 @@ msgid "Radius:" msgstr "반지름:" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Copy Polygon to UV" -msgstr "폴리곤 & UV 만들기" +msgstr "폴리곤을 UV로 복사" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Copy UV to Polygon" -msgstr "Polygon2D로 변환" +msgstr "UV를 폴리곤으로 복사" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Clear UV" @@ -6878,7 +6895,7 @@ msgstr "모두 저장" #: editor/plugins/script_editor_plugin.cpp msgid "Soft Reload Script" -msgstr "스크립트 새로고침" +msgstr "스크립트 일반 새로고침" #: editor/plugins/script_editor_plugin.cpp msgid "Copy Script Path" @@ -6921,6 +6938,14 @@ msgstr "문서 닫기" msgid "Run" msgstr "실행" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "검색" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "프로시저 단위 실행" @@ -6974,16 +6999,6 @@ msgstr "" "해당 파일은 디스크에 있는 게 더 최신입니다.\n" "어떻게 할 건가요?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "새로고침" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "다시 저장" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "디버거" @@ -7079,8 +7094,8 @@ msgstr "중단점" msgid "Go To" msgstr "이동" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "잘라내기" @@ -7107,7 +7122,7 @@ msgstr "주석 토글" #: editor/plugins/script_text_editor.cpp msgid "Fold/Unfold Line" -msgstr "행 펼치기/접기" +msgstr "행 접기/펼치기" #: editor/plugins/script_text_editor.cpp msgid "Fold All Lines" @@ -7151,7 +7166,7 @@ msgstr "파일에서 찾기..." #: editor/plugins/script_text_editor.cpp msgid "Contextual Help" -msgstr "상황에 맞는 도움" +msgstr "상황에 맞는 도움말" #: editor/plugins/script_text_editor.cpp msgid "Toggle Bookmark" @@ -7167,7 +7182,7 @@ msgstr "이전 북마크로 이동" #: editor/plugins/script_text_editor.cpp msgid "Remove All Bookmarks" -msgstr "모든 북마크 삭제" +msgstr "모든 북마크 제거" #: editor/plugins/script_text_editor.cpp msgid "Go to Function..." @@ -7184,7 +7199,7 @@ msgstr "중단점 토글" #: editor/plugins/script_text_editor.cpp msgid "Remove All Breakpoints" -msgstr "중단점 모두 삭제" +msgstr "중단점 모두 제거" #: editor/plugins/script_text_editor.cpp msgid "Go to Next Breakpoint" @@ -7303,6 +7318,10 @@ msgid "Yaw" msgstr "요" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "크기" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "그려진 객체" @@ -7528,7 +7547,7 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Use Local Space" -msgstr "로컬 스페이스 사용" +msgstr "로컬 공간 사용" #: editor/plugins/spatial_editor_plugin.cpp msgid "Use Snap" @@ -7585,7 +7604,7 @@ msgstr "변형" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Object to Floor" -msgstr "객체를 바닥에 스냅" +msgstr "개체를 바닥에 스냅" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Dialog..." @@ -7798,7 +7817,7 @@ msgstr "선택한 프레임 없음" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add %d Frame(s)" -msgstr "%d개의 프레임 추가" +msgstr "프레임 %d개 추가" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frame" @@ -7845,9 +7864,8 @@ msgid "New Animation" msgstr "새 애니메이션" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Speed:" -msgstr "속도 (FPS):" +msgstr "속도:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Loop" @@ -8105,7 +8123,7 @@ msgstr "테마 파일" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase Selection" -msgstr "선택 지우기" +msgstr "선택 항목 지우기" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Fix Invalid Tiles" @@ -8165,13 +8183,12 @@ msgid "Paint Tile" msgstr "타일 칠하기" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "" "Shift+LMB: Line Draw\n" "Shift+Command+LMB: Rectangle Paint" msgstr "" -"Shift+우클릭: 선 그리기\n" -"Shift+Ctrl+우클릭: 사각 영역 페인트" +"Shift+좌클릭: 선 그리기\n" +"Shift+Command+좌클릭: 사각 영역 페인트" #: editor/plugins/tile_map_editor_plugin.cpp msgid "" @@ -8211,7 +8228,7 @@ msgstr "TileSet에 텍스처를 추가합니다." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove selected Texture from TileSet." -msgstr "선택한 텍스처를 TileSet에서 삭제." +msgstr "선택한 텍스처를 TileSet에서 제거합니다." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from Scene" @@ -8326,23 +8343,20 @@ msgid "Create a new rectangle." msgstr "새로운 사각형을 만듭니다." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "New Rectangle" -msgstr "사각 영역 칠하기" +msgstr "새 사각 영역" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create a new polygon." msgstr "새로운 폴리곤을 만듭니다." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "New Polygon" -msgstr "폴리곤 이동" +msgstr "새 폴리곤" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Delete Selected Shape" -msgstr "선택 항목 삭제" +msgstr "선택된 모양 삭제" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Keep polygon inside region Rect." @@ -8703,7 +8717,6 @@ msgid "Add Node to Visual Shader" msgstr "노드를 비주얼 셰이더에 추가" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Node(s) Moved" msgstr "노드 이동됨" @@ -8725,9 +8738,8 @@ msgid "Visual Shader Input Type Changed" msgstr "비주얼 셰이더 입력 유형 변경됨" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "UniformRef Name Changed" -msgstr "Uniform 이름 설정" +msgstr "UniformRef 이름 변경됨" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" @@ -8908,7 +8920,7 @@ msgstr "꼭짓점과 프래그먼트 셰이더 모드에 대한 '%s' 입력 매 #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for fragment and light shader modes." -msgstr "꼭짓점과 프래그먼트 셰이더 모드에 대한 '%s' 입력 매개변수." +msgstr "프래그먼트과 조명 셰이더 모드에 대한 '%s' 입력 매개변수." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for fragment shader mode." @@ -9001,7 +9013,7 @@ msgstr "매개변수의 역쌍곡탄젠트 값을 반환합니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Finds the nearest integer that is greater than or equal to the parameter." -msgstr "매개변수보다 크거나 같은 가장 가까운 정수를 찾아요." +msgstr "매개변수보다 크거나 같은 가장 가까운 정수를 찾습니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Constrains a value to lie between two further values." @@ -9029,7 +9041,7 @@ msgstr "2가 밑인 지수 함수." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest integer less than or equal to the parameter." -msgstr "매개변수보다 적거나 같은 가장 가까운 정수를 찾아요." +msgstr "매개변수보다 적거나 같은 가장 가까운 정수를 찾습니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Computes the fractional part of the argument." @@ -9082,11 +9094,11 @@ msgstr "1.0 / 스칼라" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest integer to the parameter." -msgstr "매개변수에서 가장 가까운 정수를 찾아요." +msgstr "매개변수에서 가장 가까운 정수를 찾습니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest even integer to the parameter." -msgstr "매개변수에서 가장 가까운 짝수 정수를 찾아요." +msgstr "매개변수에서 가장 가까운 짝수 정수를 찾습니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." @@ -9725,8 +9737,8 @@ msgid "" "Couldn't load project.godot in project path (error %d). It may be missing or " "corrupted." msgstr "" -"프로젝트 경로에서 project.godot을 불러올 수 없습니다 (error %d). 누락되거나 " -"손상된 모양입니다." +"프로젝트 경로에서 project.godot을 불러올 수 없습니다 (오류 %d). 누락되거나 손" +"상된 모양입니다." #: editor/project_manager.cpp msgid "Couldn't edit project.godot in project path." @@ -9786,7 +9798,7 @@ msgstr "OpenGL ES 3.0" #: editor/project_manager.cpp msgid "Not supported by your GPU drivers." -msgstr "" +msgstr "당신의 GPU 드라이버에 의해 지원되지 않습니다." #: editor/project_manager.cpp msgid "" @@ -9958,6 +9970,10 @@ msgid "Projects" msgstr "프로젝트" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "로드 중, 기다려 주세요..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "마지막으로 수정됨" @@ -10327,6 +10343,10 @@ msgstr "오토로드" msgid "Plugins" msgstr "플러그인(Plugin)" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "기본값 가져오기" + #: editor/property_editor.cpp msgid "Preset..." msgstr "프리셋..." @@ -10405,7 +10425,7 @@ msgstr "정규 표현식 사용" #: editor/rename_dialog.cpp msgid "Advanced Options" -msgstr "고급 설정" +msgstr "고급 옵션" #: editor/rename_dialog.cpp msgid "Substitute" @@ -10437,7 +10457,7 @@ msgid "" "Compare counter options." msgstr "" "순차 정수 카운터.\n" -"카운터 설정과 비교합니다." +"카운터 옵션과 비교합니다." #: editor/rename_dialog.cpp msgid "Per-level Counter" @@ -10574,6 +10594,14 @@ msgid "Instance Child Scene" msgstr "자식 씬 인스턴스화" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "루트 노드를 같은 씬 안으로 붙여넣을 수 없습니다." + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "노드 붙여넣기" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "스크립트 떼기" @@ -10699,6 +10727,10 @@ msgid "Attach Script" msgstr "스크립트 붙이기" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "노드 잘라내기" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "노드 삭제" @@ -11503,36 +11535,31 @@ msgstr "메시를 사용하려면 이 GridMap에 MeshLibrary 리소스를 주세 #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Begin Bake" -msgstr "" +msgstr "굽기 시작" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Preparing data structures" -msgstr "" +msgstr "데이터 구조 준비 중" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Generate buffers" -msgstr "AABB 만들기" +msgstr "버퍼 생성" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Direct lighting" -msgstr "방향" +msgstr "조명 방향" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Indirect lighting" -msgstr "들여쓰기" +msgstr "간접 조명" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Post processing" msgstr "후처리" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Plotting lightmaps" -msgstr "구분하는 조명:" +msgstr "구분하는 조명" #: modules/mono/csharp_script.cpp msgid "Class name can't be a reserved keyword" @@ -11544,11 +11571,11 @@ msgstr "내부 예외 스택 추적의 끝" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Bake NavMesh" -msgstr "NavMesh 베이크" +msgstr "NavMesh 굽기" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Clear the navigation mesh." -msgstr "내비게이션 메시 지우기." +msgstr "내비게이션 메시를 지웁니다." #: modules/recast/navigation_mesh_generator.cpp msgid "Setting up Configuration..." @@ -12046,15 +12073,15 @@ msgstr "목록에서 기기 선택" #: platform/android/export/export.cpp msgid "Unable to find the 'apksigner' tool." -msgstr "" +msgstr "'apksigner' 도구를 찾을 수 없습니다." #: platform/android/export/export.cpp msgid "" "Android build template not installed in the project. Install it from the " "Project menu." msgstr "" -"프로젝트에 안드로이드 빌드 템플릿을 설치하지 않았습니다. 프로젝트 메뉴에서 설" -"치하세요." +"프로젝트에 Android 빌드 템플릿을 설치하지 않았습니다. 프로젝트 메뉴에서 설치" +"하세요." #: platform/android/export/export.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." @@ -12065,35 +12092,32 @@ msgid "Release keystore incorrectly configured in the export preset." msgstr "내보내기 프리셋에 배포 keystorke가 잘못 설정되어 있습니다." #: platform/android/export/export.cpp -#, fuzzy msgid "A valid Android SDK path is required in Editor Settings." -msgstr "편집기 설정에서 맞춤 빌드에 잘못된 안드로이드 SDK 경로입니다." +msgstr "편집기 설정에서 올바른 Android SDK 경로가 필요합니다." #: platform/android/export/export.cpp -#, fuzzy msgid "Invalid Android SDK path in Editor Settings." -msgstr "편집기 설정에서 맞춤 빌드에 잘못된 안드로이드 SDK 경로입니다." +msgstr "편집기 설정에서 잘못된 Android SDK 경로입니다." #: platform/android/export/export.cpp msgid "Missing 'platform-tools' directory!" -msgstr "" +msgstr "'platform-tools' 디렉터리가 없습니다!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK platform-tools' adb command." -msgstr "" +msgstr "Android SDK platform-tools의 adb 명령을 찾을 수 없습니다." #: platform/android/export/export.cpp -#, fuzzy msgid "Please check in the Android SDK directory specified in Editor Settings." -msgstr "편집기 설정에서 맞춤 빌드에 잘못된 안드로이드 SDK 경로입니다." +msgstr "편집기 설정에서 지정된 Android SDK 디렉터리를 확인해주세요." #: platform/android/export/export.cpp msgid "Missing 'build-tools' directory!" -msgstr "" +msgstr "'build-tools' 디렉터리가 없습니다!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK build-tools' apksigner command." -msgstr "" +msgstr "Android SDK build-tools의 apksigner 명령을 찾을 수 없습니다." #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." @@ -12157,8 +12181,8 @@ msgid "" "Trying to build from a custom built template, but no version info for it " "exists. Please reinstall from the 'Project' menu." msgstr "" -"맞춤 빌드 템플릿으로 빌드하려 했으나, 버전 정보가가 없습니다. '프로젝트' 메뉴" -"에서 다시 설치해주세요." +"맞춤 빌드 템플릿으로 빌드하려 했으나, 버전 정보가 없습니다. '프로젝트' 메뉴에" +"서 다시 설치해주세요." #: platform/android/export/export.cpp msgid "" @@ -12167,32 +12191,34 @@ msgid "" " Godot Version: %s\n" "Please reinstall Android build template from 'Project' menu." msgstr "" -"안드로이드 빌드 버전이 맞지 않음:\n" -" 설치한 템플릿: %s\n" +"Android 빌드 버전이 맞지 않음:\n" +" 설치된 템플릿: %s\n" " Godot 버전: %s\n" -"'프로젝트' 메뉴에서 안드로이드 빌드 템플릿을 다시 설치해주세요." +"'프로젝트' 메뉴에서 Android 빌드 템플릿을 다시 설치해주세요." #: platform/android/export/export.cpp msgid "Building Android Project (gradle)" -msgstr "안드로이드 프로젝트 빌드 중 (gradle)" +msgstr "Android 프로젝트 빌드 중 (gradle)" #: platform/android/export/export.cpp msgid "" "Building of Android project failed, check output for the error.\n" "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" -"안드로이드 프로젝트의 빌드에 실패했, 출력한 오류를 확인하세요.\n" -"또는 docs.godotengine.org에서 안드로이드 빌드 문서를 찾아 보세요." +"Android 프로젝트의 빌드에 실패했습니다, 출력된 오류를 확인하세요.\n" +"또는 docs.godotengine.org에서 Andoid 빌드 문서를 찾아보세요." #: platform/android/export/export.cpp msgid "Moving output" -msgstr "" +msgstr "출력 이동 중" #: platform/android/export/export.cpp msgid "" "Unable to copy and rename export file, check gradle project directory for " "outputs." msgstr "" +"내보내기 파일을 복사하고 이름을 바꿀 수 없습니다, 출력에 대한 gradle 프로젝" +"트 디렉터리를 확인하세요." #: platform/iphone/export/export.cpp msgid "Identifier is missing." @@ -12342,6 +12368,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "빈 CollisionPolygon2D는 충돌에 영향을 주지 않습니다." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "잘못된 폴리곤. 적어도 '솔리드' 빌드 모드에서 점 3개가 필요합니다." + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "잘못된 폴리곤. 적어도 '세그먼트' 빌드 모드에서 점 2개가 필요합니다." + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12378,23 +12412,23 @@ msgstr "" #: scene/2d/joints_2d.cpp msgid "Node A and Node B must be PhysicsBody2Ds" -msgstr "" +msgstr "노드 A와 노드 B는 PhysicsBody2D여야 합니다" #: scene/2d/joints_2d.cpp msgid "Node A must be a PhysicsBody2D" -msgstr "" +msgstr "노드 A는 PhysicsBody2D여야 합니다" #: scene/2d/joints_2d.cpp msgid "Node B must be a PhysicsBody2D" -msgstr "" +msgstr "노드 B는 PhysicsBody2D여야 합니다" #: scene/2d/joints_2d.cpp msgid "Joint is not connected to two PhysicsBody2Ds" -msgstr "" +msgstr "관절이 PhysicsBody2D 두 곳과 연결되어 있지 않습니다" #: scene/2d/joints_2d.cpp msgid "Node A and Node B must be different PhysicsBody2Ds" -msgstr "" +msgstr "노드 A와 노드 B는 서로 다른 PhysicsBody2D여야 합니다" #: scene/2d/light_2d.cpp msgid "" @@ -12543,27 +12577,23 @@ msgstr "ARVROrigin은 자식으로 ARVRCamera 노드가 필요합니다." #: scene/3d/baked_lightmap.cpp msgid "Finding meshes and lights" -msgstr "" +msgstr "메시 및 조명 찾는 중" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing geometry (%d/%d)" -msgstr "형태 분석 중..." +msgstr "형태 준비 중 (%d/%d)" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing environment" -msgstr "환경 보기" +msgstr "환경 준비 중" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Generating capture" -msgstr "라이트맵 생성 중" +msgstr "캡처 생성 중" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Saving lightmaps" -msgstr "라이트맵 생성 중" +msgstr "라이트맵 저장 중" #: scene/3d/baked_lightmap.cpp msgid "Done" @@ -12654,11 +12684,6 @@ msgstr "" "GIProbe는 GLES2 비디오 드라이버에서 지원하지 않습니다.\n" "대신 BakedLightmap을 사용하세요." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera는 더 이상 사용되지 않으며 Godot 4.0에서 제거됩니다." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "SpotLight의 각도를 90도 이상으로 잡게되면 그림자를 투영할 수 없습니다." @@ -12723,23 +12748,23 @@ msgstr "" #: scene/3d/physics_joint.cpp msgid "Node A and Node B must be PhysicsBodies" -msgstr "" +msgstr "노드 A와 노드 B는 PhysicsBody여야 합니다" #: scene/3d/physics_joint.cpp msgid "Node A must be a PhysicsBody" -msgstr "" +msgstr "노드 A는 PhysicsBody여야 합니다" #: scene/3d/physics_joint.cpp msgid "Node B must be a PhysicsBody" -msgstr "" +msgstr "노드 B는 PhysicsBodies여야 합니다" #: scene/3d/physics_joint.cpp msgid "Joint is not connected to any PhysicsBodies" -msgstr "" +msgstr "관절이 어떠한 PhysicsBody에도 연결되어 있지 않습니다" #: scene/3d/physics_joint.cpp msgid "Node A and Node B must be different PhysicsBodies" -msgstr "" +msgstr "노드 A와 노드 B는 서로 다른 PhysicsBody여야 합니다" #: scene/3d/remote_transform.cpp msgid "" @@ -12904,9 +12929,8 @@ msgid "Must use a valid extension." msgstr "올바른 확장자를 사용해야 합니다." #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Enable grid minimap." -msgstr "스냅 켜기" +msgstr "그리드 미니맵을 활성화합니다." #: scene/gui/popup.cpp msgid "" @@ -12964,6 +12988,8 @@ msgid "" "The sampler port is connected but not used. Consider changing the source to " "'SamplerPort'." msgstr "" +"샘플러 포트가 연결되어 있지만 사용되지 않습이다. 소스를 'SamplerPort'로 변경" +"하는 것을 고려해주세요." #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." @@ -12993,6 +13019,11 @@ msgstr "Varying은 꼭짓점 함수에만 지정할 수 있습니다." msgid "Constants cannot be modified." msgstr "상수는 수정할 수 없습니다." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "" +#~ "InterpolatedCamera는 더 이상 사용되지 않으며 Godot 4.0에서 제거됩니다." + #~ msgid "No" #~ msgstr "아니오" @@ -14779,9 +14810,6 @@ msgstr "상수는 수정할 수 없습니다." #~ msgid "Use Default Light" #~ msgstr "기본 Light 사용" -#~ msgid "Use Default sRGB" -#~ msgstr "기본 sRGB 사용" - #~ msgid "Default Light Normal:" #~ msgstr "기본 라이트 노말:" diff --git a/editor/translations/lt.po b/editor/translations/lt.po index f8c6d6acc9..585e4d4447 100644 --- a/editor/translations/lt.po +++ b/editor/translations/lt.po @@ -5,12 +5,12 @@ # Ignas Kiela <ignaskiela@super.lt>, 2017. # Kornelijus <kornelijus.github@gmail.com>, 2017, 2018. # Ignotas Gražys <ignotas.gr@gmail.com>, 2020. -# Kornelijus Tvarijanavičius <kornelitvari@protonmail.com>, 2020. +# Kornelijus Tvarijanavičius <kornelitvari@protonmail.com>, 2020, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-09-28 11:18+0000\n" +"PO-Revision-Date: 2021-02-21 10:51+0000\n" "Last-Translator: Kornelijus Tvarijanavičius <kornelitvari@protonmail.com>\n" "Language-Team: Lithuanian <https://hosted.weblate.org/projects/godot-engine/" "godot/lt/>\n" @@ -20,7 +20,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1 ? 0 : n%10>=2 && (n%100<10 || n" "%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3;\n" -"X-Generator: Weblate 4.3-dev\n" +"X-Generator: Weblate 4.5\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -650,7 +650,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1854,8 +1854,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -2504,7 +2504,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2901,14 +2901,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3062,6 +3054,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3271,7 +3279,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3978,6 +3986,20 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Pasirinkite Nodus, kuriuos norite importuoti" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importuoti Animacijas..." + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -4762,7 +4784,6 @@ msgstr "Naujas pavadinimas:" #: editor/plugins/animation_tree_player_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp -#, fuzzy msgid "Scale:" msgstr "Skalė:" @@ -4964,7 +4985,7 @@ msgid "Got:" msgstr "Gauta:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5073,7 +5094,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategorija:" @@ -6888,6 +6908,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6939,16 +6967,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -7045,8 +7063,8 @@ msgstr "Sukurti" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7269,6 +7287,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9881,6 +9903,11 @@ msgid "Projects" msgstr "" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "Atsiųsti" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10243,6 +10270,10 @@ msgstr "" msgid "Plugins" msgstr "Priedai" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10490,6 +10521,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Duplikuoti" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Atidaryti Skriptų Editorių" @@ -10614,6 +10654,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Transition Nodas" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -12235,6 +12280,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12490,11 +12543,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -12833,10 +12881,6 @@ msgstr "" #~ msgid "Path to Node:" #~ msgstr "Kelias iki Nodo:" -#, fuzzy -#~ msgid "Custom Node" -#~ msgstr "Transition Nodas" - #~ msgid "Line:" #~ msgstr "Linija:" diff --git a/editor/translations/lv.po b/editor/translations/lv.po index e7abc2a6e7..5512d59238 100644 --- a/editor/translations/lv.po +++ b/editor/translations/lv.po @@ -649,7 +649,7 @@ msgstr "Izvēlēties Celiņus ko Kopēt" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopēt" @@ -1841,8 +1841,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -2477,7 +2477,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2867,14 +2867,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3028,6 +3020,23 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +#, fuzzy +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "Sekojošie faili netika izvilkti no paketes:" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3230,7 +3239,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3914,6 +3923,20 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Izvēlēties Šablona Failu" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Ielādēt Noklusējumu" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Failā" @@ -4861,7 +4884,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4965,7 +4988,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6742,6 +6764,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6793,16 +6823,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -6899,8 +6919,8 @@ msgstr "Izveidot" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7126,6 +7146,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9704,6 +9728,11 @@ msgid "Projects" msgstr "Projekta Dibinātāji" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "Ielādēt..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10066,6 +10095,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Ielādēt Noklusējumu" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10311,6 +10345,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Dublicēt atslēgvietnes" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Galvenais Skripts:" @@ -10434,6 +10477,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Dublicēt atslēgvietnes" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -12035,6 +12083,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12290,11 +12346,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/mi.po b/editor/translations/mi.po index 33153ba3a5..260543a475 100644 --- a/editor/translations/mi.po +++ b/editor/translations/mi.po @@ -619,7 +619,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1788,8 +1788,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -2423,7 +2423,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2813,14 +2813,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -2974,6 +2966,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3176,7 +3184,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3857,6 +3865,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4804,7 +4824,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4908,7 +4928,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6675,6 +6694,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6726,16 +6753,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -6828,8 +6845,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7050,6 +7067,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9570,6 +9591,10 @@ msgid "Projects" msgstr "" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -9930,6 +9955,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10173,6 +10202,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10293,6 +10330,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -11867,6 +11908,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12122,11 +12171,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/mk.po b/editor/translations/mk.po index 71da151591..cd72ecd259 100644 --- a/editor/translations/mk.po +++ b/editor/translations/mk.po @@ -626,7 +626,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Копирај" @@ -1795,8 +1795,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -2430,7 +2430,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2820,14 +2820,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -2981,6 +2973,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3183,7 +3191,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3864,6 +3872,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4811,7 +4831,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4915,7 +4935,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6682,6 +6701,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6733,16 +6760,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -6835,8 +6852,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7057,6 +7074,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9577,6 +9598,10 @@ msgid "Projects" msgstr "" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -9937,6 +9962,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10180,6 +10209,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10300,6 +10337,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -11874,6 +11915,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12129,11 +12178,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/ml.po b/editor/translations/ml.po index a72cd78ca2..fb9de4a419 100644 --- a/editor/translations/ml.po +++ b/editor/translations/ml.po @@ -629,7 +629,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1798,8 +1798,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -2435,7 +2435,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2825,14 +2825,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -2986,6 +2978,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3188,7 +3196,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3869,6 +3877,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4819,7 +4839,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4923,7 +4943,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6691,6 +6710,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6742,16 +6769,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -6844,8 +6861,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7066,6 +7083,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9587,6 +9608,10 @@ msgid "Projects" msgstr "" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -9947,6 +9972,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10190,6 +10219,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10310,6 +10347,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -11885,6 +11926,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12140,11 +12189,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/mr.po b/editor/translations/mr.po index 6f019300ff..cf3a24a739 100644 --- a/editor/translations/mr.po +++ b/editor/translations/mr.po @@ -626,7 +626,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1795,8 +1795,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -2430,7 +2430,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2820,14 +2820,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -2981,6 +2973,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3183,7 +3191,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3864,6 +3872,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4811,7 +4831,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4915,7 +4935,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6682,6 +6701,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6733,16 +6760,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -6835,8 +6852,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7057,6 +7074,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9578,6 +9599,10 @@ msgid "Projects" msgstr "" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -9938,6 +9963,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10181,6 +10210,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10301,6 +10338,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -11875,6 +11916,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12130,11 +12179,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/ms.po b/editor/translations/ms.po index 2f3e1481a2..c0a7f7cea2 100644 --- a/editor/translations/ms.po +++ b/editor/translations/ms.po @@ -649,7 +649,7 @@ msgstr "Pilih Trek untuk Disalin" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Salin" @@ -1865,8 +1865,8 @@ msgid "Open a File or Directory" msgstr "Buka Fail atau Direktori" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Simpan" @@ -2542,7 +2542,8 @@ msgstr "" "gagal." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Tidak dapat mencari medan skrip untuk pemalam addon di: 'res://addons/%s'." @@ -3022,15 +3023,6 @@ msgid "Help" msgstr "Bantuan" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -#, fuzzy -msgid "Search" -msgstr "Cari" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp #, fuzzy msgid "Online Docs" @@ -3214,6 +3206,23 @@ msgstr "Buka & Jalankan Skrip" #: editor/editor_node.cpp #, fuzzy +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "Fail berikut gagal diekstrak dari pakej:" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy msgid "New Inherited" msgstr "Baru Diwarisi" @@ -3458,7 +3467,7 @@ msgstr "Buat Unik" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp #, fuzzy msgid "Paste" msgstr "Tampal" @@ -4183,6 +4192,21 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Pilih Nod(Nod-nod) untuk Diimport" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Import" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Muatkan Lalai" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -5133,7 +5157,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5239,7 +5263,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -7012,6 +7035,15 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +#, fuzzy +msgid "Search" +msgstr "Cari" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7063,16 +7095,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -7165,8 +7187,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7388,6 +7410,11 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Size" +msgstr "Saiz: " + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9924,6 +9951,11 @@ msgid "Projects" msgstr "" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "Mengambil maklumat cermin, sila tunggu..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10284,6 +10316,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Muatkan Lalai" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10528,6 +10565,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Anim Menduakan Kunci" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10649,6 +10695,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Anim Menduakan Kunci" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -12231,6 +12282,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12486,11 +12545,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/nb.po b/editor/translations/nb.po index 90f033ad39..9e69510739 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -3,24 +3,25 @@ # Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). # This file is distributed under the same license as the Godot source code. # Allan Nordhøy <epost@anotheragency.no>, 2017-2018, 2019, 2020, 2021. -# Anonymous <GentleSaucepan@protonmail.com>, 2017. +# Anonymous <GentleSaucepan@protonmail.com>, 2017, 2021. # Elias <eliasnykrem@gmail.com>, 2018. # flesk <eivindkn@gmail.com>, 2017, 2019. -# Frank T. Rambol <frank@d-fect.com>, 2018. +# Frank T. Rambol <frank@d-fect.com>, 2018, 2021. # Jørgen Aarmo Lund <jorgen.aarmo@gmail.com>, 2016, 2019. -# NicolaiF <nico-fre@hotmail.com>, 2017-2018, 2019. +# NicolaiF <nico-fre@hotmail.com>, 2017-2018, 2019, 2021. # Norwegian Disaster <stian.furu.overbye@gmail.com>, 2017. # passeride <lukas@passeride.com>, 2017. # Byzantin <kasper-hoel@hotmail.com>, 2018. # Hans-Marius Øverås <hansmariusoveras@gmail.com>, 2019. # Revolution <revosw@gmail.com>, 2019. # Petter Reinholdtsen <pere-weblate@hungry.com>, 2019, 2020. +# Patrick Sletvold <patricksletvold@hotmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-01-12 13:32+0000\n" -"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n" +"PO-Revision-Date: 2021-02-27 00:47+0000\n" +"Last-Translator: Anonymous <GentleSaucepan@protonmail.com>\n" "Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/godot-" "engine/godot/nb_NO/>\n" "Language: nb\n" @@ -28,7 +29,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 4.4.1-dev\n" +"X-Generator: Weblate 4.5\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -200,7 +201,6 @@ msgid "Change Animation Loop" msgstr "Endre Animasjonssløyfe" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Property Track" msgstr "Egenskapsspor" @@ -209,24 +209,20 @@ msgid "3D Transform Track" msgstr "3D transformasjonsspor" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Call Method Track" msgstr "Kall metode-spor" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Bezier Curve Track" -msgstr "Bezier-kurvespor" +msgstr "Bézier-kurvespor" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Audio Playback Track" msgstr "Lydavspillingsspor" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Playback Track" -msgstr "Stopp avspilling av animasjon. (S)" +msgstr "Animasjonavspillingspor" #: editor/animation_track_editor.cpp msgid "Animation length (frames)" @@ -241,7 +237,6 @@ msgid "Add Track" msgstr "Legg til Spor" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Looping" msgstr "Animasjonsløkke" @@ -260,23 +255,20 @@ msgid "Anim Clips:" msgstr "Anim-klipp:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Change Track Path" -msgstr "Endre Array-verdi" +msgstr "Endre sporsti" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Toggle this track on/off." -msgstr "Vis/skjul distraksjonsfri modus." +msgstr "Slå spor på/av." #: editor/animation_track_editor.cpp msgid "Update Mode (How this property is set)" msgstr "Oppdateringsmodus (Hvordan denne egenskapen settes)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Interpolation Mode" -msgstr "Animasjonsnode" +msgstr "Interpolasjonsmodus" #: editor/animation_track_editor.cpp msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" @@ -334,7 +326,7 @@ msgstr "Pakk Inn Sløyfeinterp" #: editor/animation_track_editor.cpp #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key" -msgstr "Sett inn Nøkkel" +msgstr "Sett inn nøkkel" #: editor/animation_track_editor.cpp msgid "Duplicate Key(s)" @@ -345,19 +337,16 @@ msgid "Delete Key(s)" msgstr "Fjern Nøkler" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Change Animation Update Mode" -msgstr "Endre Animasjonsnavn:" +msgstr "Endre oppdateringsmetode for animasjon" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Change Animation Interpolation Mode" -msgstr "Animasjonsnode" +msgstr "Endre interpolasjonsmodus for animasjon" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Change Animation Loop Mode" -msgstr "Endre Anim-Løkke" +msgstr "Endre løkkemodus for animasjon" #: editor/animation_track_editor.cpp msgid "Remove Anim Track" @@ -412,9 +401,8 @@ msgid "Rearrange Tracks" msgstr "Omorganiser Spor" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Transform tracks only apply to Spatial-based nodes." -msgstr "Transformasjonsspor kan kun brukes på Spatial-baserte noder." +msgstr "Transformeringsspor virker kun på Spatial-baserte noder." #: editor/animation_track_editor.cpp msgid "" @@ -438,47 +426,40 @@ msgstr "" "En animansjonsavspiller kan ikke animere seg selv, kun andre avspillere." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Not possible to add a new track without a root" msgstr "Ikke mulig å legge til et nytt spor uten en rot" #: editor/animation_track_editor.cpp msgid "Invalid track for Bezier (no suitable sub-properties)" -msgstr "" +msgstr "Ugyldig spor for Bézier (ingen passende underegenskaper)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Bezier Track" -msgstr "Anim Legg til Spor" +msgstr "Legg til Bézier-spor" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Track path is invalid, so can't add a key." msgstr "Sporsti er ugyldig, så kan ikke legge til en nøkkel." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Track is not of type Spatial, can't insert key" -msgstr "Spor er ikke av type Spatial, kan ikke legge til nøkkel" +msgstr "Spor er ikke av typen Spatial, kan ikke sette inn nøkkel" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Transform Track Key" -msgstr "3D transformasjonsspor" +msgstr "Legg til transformasjons-spornøkkel" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Track Key" -msgstr "Anim Legg til Spor" +msgstr "Legg til spornøkkel" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a method key." msgstr "Sporsti er ugyldig, så kan ikke legge til en metodenøkkel." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Method Track Key" -msgstr "Kall metode-spor" +msgstr "Legg til metode-spornøkkel" #: editor/animation_track_editor.cpp msgid "Method not found in object: " @@ -489,26 +470,22 @@ msgid "Anim Move Keys" msgstr "Anim Flytt Nøkler" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Clipboard is empty" -msgstr "Ressurs-utklippstavle er tom!" +msgstr "Utklippstavlen er tom" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Paste Tracks" -msgstr "Lim inn Parametre" +msgstr "Sett in spor" #: editor/animation_track_editor.cpp msgid "Anim Scale Keys" msgstr "Anim Skalér Nøkler" #: editor/animation_track_editor.cpp -#, fuzzy msgid "" "This option does not work for Bezier editing, as it's only a single track." msgstr "" -"Dette valget virker ikke på Bezier-redigering, siden det kun er ett enkelt " -"spor." +"Dette valget virker ikke på Bézier-redigering, da det kun er ett enkelt spor." #: editor/animation_track_editor.cpp msgid "" @@ -522,10 +499,19 @@ msgid "" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" +"Denne animasjonen hører til en importert scene, så endringer på importerte " +"spor vil ikke bli lagret.\n" +"\n" +"For å legge til egendefinerte spor, gå til scenens importinstillinger og " +"sett\n" +"\"Animasjon > Lagring\" til \"Filer\", aktiver \"Animasjon > Behold egne spor" +"\", og importer på nytt.\n" +"Alternativt, bruk et importoppsett som importerer animasjonen som separate " +"filer." #: editor/animation_track_editor.cpp msgid "Warning: Editing imported animation" -msgstr "" +msgstr "Advarsel: Redigerer importert animasjon" #: editor/animation_track_editor.cpp #, fuzzy @@ -570,9 +556,8 @@ msgid "Edit" msgstr "Rediger" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation properties." -msgstr "Animasjon" +msgstr "Animasjon egenskaper." #: editor/animation_track_editor.cpp #, fuzzy @@ -589,26 +574,23 @@ msgstr "Skaler Fra Peker" #: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp msgid "Duplicate Selection" -msgstr "Dupliser Utvalg" +msgstr "Dupliser utvalg" #: editor/animation_track_editor.cpp msgid "Duplicate Transposed" -msgstr "Dupliser Transponert" +msgstr "Dupliser transponert" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Delete Selection" -msgstr "Slett Valgte" +msgstr "Slett valgte" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Go to Next Step" -msgstr "Gå til Neste Steg" +msgstr "Gå til neste steg" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Go to Previous Step" -msgstr "Gå til Forrige Steg" +msgstr "Gå til forrige steg" #: editor/animation_track_editor.cpp msgid "Optimize Animation" @@ -671,16 +653,15 @@ msgid "Scale Ratio:" msgstr "Skaler Størrelsesforhold:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "Velg spor å kopiere:" +msgstr "Velg spor å kopiere" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Lim inn" @@ -690,9 +671,8 @@ msgid "Select All/None" msgstr "Kutt Noder" #: editor/animation_track_editor_plugins.cpp -#, fuzzy msgid "Add Audio Track Clip" -msgstr "Lydklipp:" +msgstr "Legg til lyd-spor klipp" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" @@ -723,19 +703,16 @@ msgid "Line Number:" msgstr "Linjenummer:" #: editor/code_editor.cpp -#, fuzzy msgid "%d replaced." -msgstr "Erstatt..." +msgstr "%d erstattet." #: editor/code_editor.cpp editor/editor_help.cpp -#, fuzzy msgid "%d match." -msgstr "%d samsvar." +msgstr "%d samsvarer." #: editor/code_editor.cpp editor/editor_help.cpp -#, fuzzy msgid "%d matches." -msgstr "Ingen Treff" +msgstr "%d sammsvarer." #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Match Case" @@ -760,7 +737,7 @@ msgstr "Kun Valgte" #: editor/code_editor.cpp editor/plugins/script_text_editor.cpp #: editor/plugins/text_editor.cpp msgid "Standard" -msgstr "" +msgstr "Standard" #: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp msgid "Toggle Scripts Panel" @@ -791,9 +768,8 @@ msgid "Line and column numbers." msgstr "Linje- og kolonnenummer." #: editor/connections_dialog.cpp -#, fuzzy msgid "Method in target node must be specified." -msgstr "Metode i mål-Node må spesifiseres!" +msgstr "Metode i målnoden må spesifiseres." #: editor/connections_dialog.cpp #, fuzzy @@ -820,13 +796,12 @@ msgid "Connect to Script:" msgstr "Kan ikke koble til tjener:" #: editor/connections_dialog.cpp -#, fuzzy msgid "From Signal:" -msgstr "Signaler:" +msgstr "Fra signal:" #: editor/connections_dialog.cpp msgid "Scene does not contain any script." -msgstr "" +msgstr "Scenen inneholder ikke noen skript." #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp @@ -854,14 +829,12 @@ msgid "Extra Call Arguments:" msgstr "Ekstra Call Argumenter:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Receiver Method:" -msgstr "Lim inn Noder" +msgstr "Mottakermetode:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Advanced" -msgstr "Snapping innstillinger" +msgstr "Avansert" #: editor/connections_dialog.cpp msgid "Deferred" @@ -1064,9 +1037,8 @@ msgid "Fix Broken" msgstr "Reparer Ødelagt" #: editor/dependency_editor.cpp -#, fuzzy msgid "Dependency Editor" -msgstr "Avhengighetsredigeringsverktøy" +msgstr "Redigeringsverktøy for avhengigheter" #: editor/dependency_editor.cpp msgid "Search Replacement Resource:" @@ -1087,14 +1059,15 @@ msgid "Owners Of:" msgstr "Eiere Av:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Remove selected files from the project? (no undo)\n" "You can find the removed files in the system trash to restore them." -msgstr "Fjerne valgte filer fra prosjektet? (kan ikke angres)" +msgstr "" +"Fjerne valgte filer fra prosjektet? (kan ikke angres)\n" +"Du kan finne de fjernede filene i systemets papirkurv, og gjenopprette dem " +"derfra." #: editor/dependency_editor.cpp -#, fuzzy msgid "" "The files being removed are required by other resources in order for them to " "work.\n" @@ -1102,7 +1075,9 @@ msgid "" "You can find the removed files in the system trash to restore them." msgstr "" "Filene som fjernes kreves for at andre ressurser skal virke.\n" -"Fjern dem likevel? (kan ikke angres)" +"Fjerne dem likevel? (kan ikke angres)\n" +"Du kan finne de fjernede filene i systemets papirkurv, og gjenopprette dem " +"derfra." #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -1163,14 +1138,12 @@ msgid "Resources Without Explicit Ownership:" msgstr "Ressurser uten eksplisitt eierskap:" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Key" -msgstr "Endre Ordboksnøkkel" +msgstr "Endre listenøkkel" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "Endre Ordboksverdi" +msgstr "Endre listeverdi" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" @@ -1444,7 +1417,6 @@ msgid "There is no '%s' file." msgstr "Det finnes ingen «%s»-fil" #: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Layout" msgstr "Layout" @@ -1453,9 +1425,8 @@ msgid "Invalid file, not an audio bus layout." msgstr "Ugyldig fil, ikke et audio bus oppsett." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Error saving file: %s" -msgstr "Error ved lagring av TileSet!" +msgstr "Feil ved lagring av filen: %s" #: editor/editor_audio_buses.cpp msgid "Add Bus" @@ -1643,7 +1614,6 @@ msgid "Storing File:" msgstr "Lagrer Fil:" #: editor/editor_export.cpp -#, fuzzy msgid "No export template found at the expected path:" msgstr "Ingen eksportmal funnet på forventet søkesti:" @@ -1770,7 +1740,7 @@ msgstr "Erstatt Alle" #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" -msgstr "" +msgstr "Profil må være et gyldig filnavn, og kan ikke inneholde '.'" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1797,9 +1767,8 @@ msgid "Class Options:" msgstr "Beskrivelse:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enable Contextual Editor" -msgstr "Åpne den neste Editoren" +msgstr "Aktiver kontekstavhengig redigeringsverktøy" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1817,7 +1786,7 @@ msgstr "Søk i klasser" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." -msgstr "" +msgstr "Filformatet til '%s' er ugyldig, importen ble avbrutt." #: editor/editor_feature_profile.cpp msgid "" @@ -1826,9 +1795,8 @@ msgid "" msgstr "" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Error saving profile to path: '%s'." -msgstr "Error ved lagring av TileSet!" +msgstr "Feil ved lagring av profilen til stien: '%s'." #: editor/editor_feature_profile.cpp msgid "Unset" @@ -1961,8 +1929,8 @@ msgid "Open a File or Directory" msgstr "Åpne ei fil eller mappe" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Lagre" @@ -2252,9 +2220,8 @@ msgid "Set" msgstr "Sett" #: editor/editor_inspector.cpp -#, fuzzy msgid "Set Multiple:" -msgstr "Sett Mange:" +msgstr "Sett mange:" #: editor/editor_log.cpp msgid "Output:" @@ -2286,9 +2253,8 @@ msgstr "Stopp" #: 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!" +msgstr "Start" #: editor/editor_network_profiler.cpp msgid "%s/s" @@ -2370,7 +2336,7 @@ msgstr "Kan ikke åpne '%s'. Filen kan ha blitt flyttet eller slettet." #: editor/editor_node.cpp msgid "Error while parsing '%s'." -msgstr "Error ved parsing av '%s'." +msgstr "Feil ved parsing av '%s'." #: editor/editor_node.cpp msgid "Unexpected end of file '%s'." @@ -2401,7 +2367,6 @@ msgid "This operation can't be done without a tree root." msgstr "Denne operasjonen kan ikke gjennomføres uten en trerot." #: editor/editor_node.cpp -#, fuzzy msgid "" "This scene can't be saved because there is a cyclic instancing inclusion.\n" "Please resolve it and then attempt to save again." @@ -2428,7 +2393,7 @@ msgstr "Kan ikke laste MeshLibrary for sammenslåing!" #: editor/editor_node.cpp msgid "Error saving MeshLibrary!" -msgstr "Error ved lagring av MeshLibrary!" +msgstr "Feil ved lagring av MeshLibrary!" #: editor/editor_node.cpp msgid "Can't load TileSet for merging!" @@ -2436,7 +2401,7 @@ msgstr "Kan ikke laste TileSet for sammenslåing!" #: editor/editor_node.cpp msgid "Error saving TileSet!" -msgstr "Error ved lagring av TileSet!" +msgstr "Feil ved lagring av TileSet!" #: editor/editor_node.cpp msgid "" @@ -2619,7 +2584,7 @@ msgstr "Ja" #: editor/editor_node.cpp msgid "Exit the editor?" -msgstr "Avslutt editoren?" +msgstr "Avslutt redigeringsverktøyet?" #: editor/editor_node.cpp msgid "Open Project Manager?" @@ -2666,7 +2631,8 @@ msgstr "" "mislyktes." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "Kunne ikke finne skriptfelt for addon-plugin i: 'res://addons/%s'." #: editor/editor_node.cpp @@ -2685,7 +2651,8 @@ msgstr "" msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." msgstr "" -"Kan ikke laste addon skript fra bane: Basistype '%s' er ikke en EditorPlugin." +"Kan ikke laste addon-skript fra stien: Basistypen '%s' er ikke en " +"EditorPlugin." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." @@ -2923,7 +2890,7 @@ msgstr "Versjon:" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Set Up Version Control" -msgstr "" +msgstr "Sett opp versjonskontroll" #: editor/editor_node.cpp msgid "Shut Down Version Control" @@ -2939,9 +2906,8 @@ msgid "Install Android Build Template..." msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "Open Project Data Folder" -msgstr "Åpne ProsjektManager?" +msgstr "Åpne prosjektdatamappe" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" @@ -3028,17 +2994,16 @@ msgid "Synchronize Scene Changes" msgstr "Synkroniser Sceneendringer" #: editor/editor_node.cpp -#, fuzzy msgid "" "When this option is enabled, any changes made to the scene in the editor " "will be replicated in the running project.\n" "When used remotely on a device, this is more efficient when the network " "filesystem option is enabled." msgstr "" -"Når denne innstillingen er aktivert, alle endringer gjort til scenen i " -"editoren vil bli replikert i det kjørende spillet.\n" -"Når det brukes eksternt på en enhet, dette er mer effektivt med et " -"nettverksfilsystem." +"Når denne innstillingen er aktivert, vil alle endringer gjort i scenen i " +"redigeringsverktøyet bli gjenspeilet i det kjørende spillet.\n" +"Når det brukes eksternt på en enhet, er dette mer effektivt med et " +"nettverksfilsystem aktivert." #: editor/editor_node.cpp #, fuzzy @@ -3115,14 +3080,6 @@ msgid "Help" msgstr "Hjelp" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Søk" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Online Dokumentasjon" @@ -3196,9 +3153,8 @@ msgid "Save & Restart" msgstr "Lagre & Avslutt" #: editor/editor_node.cpp -#, fuzzy msgid "Spins when the editor window redraws." -msgstr "Snurrer når editorvinduet rendrer om!" +msgstr "Snurrer når redigeringsvinduet tegner opp på nytt." #: editor/editor_node.cpp #, fuzzy @@ -3286,13 +3242,31 @@ msgid "Open & Run a Script" msgstr "Åpne & Kjør et Skript" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"Følgende filer er nyere på disken.\n" +"Hvilken handling skal utføres?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Gjeninnlat" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Lagre på nytt" + +#: editor/editor_node.cpp #, fuzzy msgid "New Inherited" msgstr "Ny Arvet" #: editor/editor_node.cpp msgid "Load Errors" -msgstr "Last Errors" +msgstr "Last feil" #: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Select" @@ -3300,11 +3274,11 @@ msgstr "Velg" #: editor/editor_node.cpp msgid "Open 2D Editor" -msgstr "Åpne 2D Editor" +msgstr "Åpne 2D-redigeringsverktøy" #: editor/editor_node.cpp msgid "Open 3D Editor" -msgstr "Åpne 3D Editor" +msgstr "Åpne 3D-redigeringsverktøy" #: editor/editor_node.cpp msgid "Open Script Editor" @@ -3316,16 +3290,15 @@ msgstr "Åpne Assets-Bibliotek" #: editor/editor_node.cpp msgid "Open the next Editor" -msgstr "Åpne den neste Editoren" +msgstr "Åpne det neste redigeringsverktøyet" #: editor/editor_node.cpp msgid "Open the previous Editor" -msgstr "Åpne den forrige Editoren" +msgstr "Åpne det forrige redigeringsverktøy" #: editor/editor_node.h -#, fuzzy msgid "Warning!" -msgstr "Advarsler" +msgstr "Advarsel!" #: editor/editor_path.cpp #, fuzzy @@ -3389,9 +3362,8 @@ msgid "Average Time (sec)" msgstr "Gjennomsnittstid (sek)" #: editor/editor_profiler.cpp -#, fuzzy msgid "Frame %" -msgstr "Frame %" +msgstr "Bilde %" #: editor/editor_profiler.cpp msgid "Physics Frame %" @@ -3406,9 +3378,8 @@ msgid "Self" msgstr "Selv" #: editor/editor_profiler.cpp -#, fuzzy msgid "Frame #:" -msgstr "Frame #:" +msgstr "Bilde #:" #: editor/editor_profiler.cpp #, fuzzy @@ -3506,7 +3477,7 @@ msgstr "Gjør Unik" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Lim inn" @@ -3585,7 +3556,7 @@ msgstr "" #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" -msgstr "Velg Node(r) for Importering" +msgstr "Velg node(r) som skal importeres" #: editor/editor_sub_scene.cpp editor/project_manager.cpp #, fuzzy @@ -3635,9 +3606,8 @@ msgid "Retrieving mirrors, please wait..." msgstr "Henter fillager, vennligst vent..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Remove template version '%s'?" -msgstr "Fjern mal versjon '%s'?" +msgstr "Fjern malversjon '%s'?" #: editor/export_template_manager.cpp msgid "Can't open export templates zip." @@ -3653,9 +3623,8 @@ msgid "No version.txt found inside templates." msgstr "Ingen version.txt funnet i mal." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error creating path for templates:" -msgstr "Feil ved laging av sti for mal:\n" +msgstr "Feil ved laging av sti for maler:" #: editor/export_template_manager.cpp msgid "Extracting Export Templates" @@ -3840,14 +3809,12 @@ msgid "Cannot move/rename resources root." msgstr "Kan ikke flytte/endre navn ressursrot" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Cannot move a folder into itself." -msgstr "Kan ikke flytte mappe inn i seg selv.\n" +msgstr "Kan ikke flytte en mappe inn i seg selv." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Error moving:" -msgstr "Error ved flytting:\n" +msgstr "Feil ved flytting:" #: editor/filesystem_dock.cpp #, fuzzy @@ -3855,9 +3822,8 @@ msgid "Error duplicating:" msgstr "Feil ved innlasting:" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Unable to update dependencies:" -msgstr "Kan ikke oppdatere av avhengigheter:\n" +msgstr "Kan ikke oppdatere avhengigheter:" #: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp msgid "No name provided." @@ -4123,9 +4089,8 @@ msgid "Remove from Group" msgstr "Fjern fra Gruppe" #: editor/groups_editor.cpp -#, fuzzy msgid "Group name already exists." -msgstr "ERROR: Animasjonsnavnet finnes allerede!" +msgstr "Gruppenavnet finnes allerede." #: editor/groups_editor.cpp #, fuzzy @@ -4167,9 +4132,8 @@ msgid "Empty groups will be automatically removed." msgstr "" #: editor/groups_editor.cpp -#, fuzzy msgid "Group Editor" -msgstr "Åpne SkriptEditor" +msgstr "Redigeringsverktøy for grupper" #: editor/groups_editor.cpp #, fuzzy @@ -4227,7 +4191,7 @@ msgstr "Importerer Scene..." #: editor/import/resource_importer_scene.cpp msgid "Generating Lightmaps" -msgstr "Genererer Lyskart" +msgstr "Genererer lyskart" #: editor/import/resource_importer_scene.cpp msgid "Generating for Mesh: " @@ -4248,7 +4212,7 @@ msgstr "Ugyldig/ødelagt skript for post-import (sjekk konsoll):" #: editor/import/resource_importer_scene.cpp msgid "Error running post-import script:" -msgstr "Error ved kjøring av post-import script:" +msgstr "Feil ved kjøring av post-import script:" #: editor/import/resource_importer_scene.cpp msgid "Did you return a Node-derived object in the `post_import()` method?" @@ -4258,6 +4222,21 @@ msgstr "" msgid "Saving..." msgstr "Lagrer..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Velg Modus" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importer" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Last Standard" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Filer" @@ -4324,9 +4303,8 @@ msgid "Copy Params" msgstr "Kopier Parametre" #: editor/inspector_dock.cpp -#, fuzzy msgid "Edit Resource Clipboard" -msgstr "Ressurs-utklippstavle er tom!" +msgstr "Rediger ressurs-utklippstavlen" #: editor/inspector_dock.cpp msgid "Copy Resource" @@ -4437,16 +4415,14 @@ msgid "Create points." msgstr "Slett punkter" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "" "Edit points.\n" "LMB: Move Point\n" "RMB: Erase Point" msgstr "" -"Endre eksisterende polygon:\n" -"Venstreklikk: Flytt Punkt.\n" -"Ctrl+Venstreklikk: Splitt Segment.\n" -"Høyreklikk: Fjern Punkt." +"Rediger punkter.\n" +"Venstreklikk: Flytt punkt\n" +"Høyreklikk: Fjern punkt" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/animation_blend_space_1d_editor.cpp @@ -4461,7 +4437,7 @@ msgstr "Rediger Poly" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "Insert Point" -msgstr "Sett inn Punkt" +msgstr "Sett inn punkt" #: editor/plugins/abstract_polygon_2d_editor.cpp #, fuzzy @@ -4578,9 +4554,8 @@ msgid "Open Animation Node" msgstr "Animasjonsnode" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Triangle already exists." -msgstr "ERROR: Animasjonsnavnet finnes allerede!" +msgstr "Triangelet finnes allerede." #: editor/plugins/animation_blend_space_2d_editor.cpp #, fuzzy @@ -4782,14 +4757,12 @@ msgid "Remove Animation" msgstr "Fjern Animasjon" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Invalid animation name!" -msgstr "ERROR: Ugyldig animasjonsnavn!" +msgstr "Ugyldig animasjonsnavn!" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Animation name already exists!" -msgstr "ERROR: Animasjonsnavnet finnes allerede!" +msgstr "Animasjonsnavnet finnes allerede!" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -4814,14 +4787,12 @@ msgid "Duplicate Animation" msgstr "Dupliser Animasjon" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "No animation to copy!" -msgstr "ERROR: Ingen animasjon å kopiere!" +msgstr "Ingen animasjon å kopiere!" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "No animation resource on clipboard!" -msgstr "ERROR: Ingen animasjonsressurs på utklippstavlen!" +msgstr "Ingen animasjonsressurs på utklippstavlen!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Pasted Animation" @@ -4832,9 +4803,8 @@ msgid "Paste Animation" msgstr "Lim inn Animasjon" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "No animation to edit!" -msgstr "ERROR: Ingen animasjon å endre!" +msgstr "Ingen animasjon å redigere!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from current pos. (A)" @@ -4958,7 +4928,7 @@ msgstr "Animasjonsnavn:" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp msgid "Error!" -msgstr "Error!" +msgstr "Feil!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Times:" @@ -4980,9 +4950,8 @@ msgid "Move Node" msgstr "Flytt Modus" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Transition exists!" -msgstr "Overgang" +msgstr "Overgang eksisterer!" #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy @@ -4992,7 +4961,7 @@ msgstr "Overgang" #: editor/plugins/animation_state_machine_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Add Node" -msgstr "" +msgstr "Legg til node" #: editor/plugins/animation_state_machine_editor.cpp msgid "End" @@ -5298,10 +5267,12 @@ msgid "Got:" msgstr "Fikk:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Feilet sha256 hash-sjekk" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy msgid "Asset Download Error:" msgstr "Asset Nedlasting Error:" @@ -5339,7 +5310,7 @@ msgstr "Prøv på nytt" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download Error" -msgstr "Nedlastningserror" +msgstr "Nedlastningsfeil" #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy @@ -5413,7 +5384,6 @@ msgid "Sort:" msgstr "Sorter:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategori:" @@ -6015,7 +5985,7 @@ msgstr "Plasser Utvalg I Midten" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Frame Selection" -msgstr "" +msgstr "Bildeutvalg" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Preview Canvas Scale" @@ -6101,7 +6071,7 @@ msgstr "Lag Node" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Error instancing scene from %s" -msgstr "Error ved instansiering av scene fra %s" +msgstr "Feil ved instansiering av scene fra %s" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -6127,7 +6097,7 @@ msgstr "Rediger Poly" #: editor/plugins/collision_polygon_editor_plugin.cpp msgid "Edit Poly (Remove Point)" -msgstr "Rediger Poly (Fjern Punkt)" +msgstr "Rediger Poly (fjern punkt)" #: editor/plugins/collision_shape_2d_editor_plugin.cpp #, fuzzy @@ -6487,11 +6457,12 @@ msgid "Remove item %d?" msgstr "Fjern element %d?" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "" "Update from existing scene?:\n" "%s" -msgstr "Oppdater fra Scene" +msgstr "" +"Oppdater fra eksisterende scene?:\n" +"%s" #: editor/plugins/mesh_library_editor_plugin.cpp #, fuzzy @@ -6904,9 +6875,8 @@ msgid "Paint Bone Weights" msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Open Polygon 2D UV editor." -msgstr "Åpne 2D Editor" +msgstr "Åpne 2D-redigeringsverktøy for polygon-UV" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Polygon 2D UV Editor" @@ -7058,7 +7028,7 @@ msgstr "Skaler Polygon" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ERROR: Couldn't load resource!" -msgstr "ERROR: Kunne ikke laste ressurs!" +msgstr "FEIL: Kunne ikke laste ressurs!" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Add Resource" @@ -7121,16 +7091,12 @@ msgid "Clear Recent Files" msgstr "Fjern Nylige Filer" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Close and save changes?" -msgstr "" -"Lukk og lagre endringer?\n" -"\"" +msgstr "Lukke og lagre endringer?" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error writing TextFile:" -msgstr "Error ved lagring av TileSet!" +msgstr "Feil ved lagring av TextFile:" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -7138,29 +7104,24 @@ msgid "Could not load file at:" msgstr "Kunne ikke opprette mappe." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error saving file!" -msgstr "Error ved lagring av TileSet!" +msgstr "Feil ved lagring av filen!" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error while saving theme." -msgstr "Error ved lasting av tema" +msgstr "Feil ved lagring av tema" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error Saving" -msgstr "Error ved lagring" +msgstr "Feil ved lagring" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error importing theme." -msgstr "Error ved importering av tema" +msgstr "Feil ved importering av tema." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error Importing" -msgstr "Error ved importering" +msgstr "Feil ved importering" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -7200,11 +7161,11 @@ msgstr "Importer Tema" #: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" -msgstr "Error ved lasting av tema" +msgstr "Feil ved lagring av tema" #: editor/plugins/script_editor_plugin.cpp msgid "Error saving" -msgstr "Error ved lagring" +msgstr "Feil ved lagring" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme As..." @@ -7328,6 +7289,14 @@ msgstr "Lukk Dokumentasjon" msgid "Run" msgstr "Kjør" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Søk" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Tre inn i" @@ -7381,16 +7350,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Gjeninnlat" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Lagre på nytt" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Feilsøking" @@ -7491,8 +7450,8 @@ msgstr "Slett punkter" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Klipp ut" @@ -7732,6 +7691,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "Størrelse" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -8890,11 +8853,12 @@ msgid "Delete selected Rect." msgstr "Slett valgte filer?" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "" "Select current edited sub-tile.\n" "Click on another Tile to edit it." -msgstr "Velg Gjeldende Mappe" +msgstr "" +"Velg gjeldende redigerte underflis.\n" +"Klikk på en annen flis for å redigere den." #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8902,13 +8866,16 @@ msgid "Delete polygon." msgstr "Slett punkter" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "" "LMB: Set bit on.\n" "RMB: Set bit off.\n" "Shift+LMB: Set wildcard bit.\n" "Click on another Tile to edit it." -msgstr "Velg Gjeldende Mappe" +msgstr "" +"Venstreklikk: Sett bit på.\n" +"Høyreklikk: Sett bit av.\n" +"Skift+venstreklikk: Sett jokertegn-bit.\n" +"Klikk på en annen flis for å redigere den." #: editor/plugins/tile_set_editor_plugin.cpp msgid "" @@ -8924,11 +8891,12 @@ msgid "" msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "" "Select sub-tile to change its z index.\n" "Click on another Tile to edit it." -msgstr "Velg Gjeldende Mappe" +msgstr "" +"Velg underflis for å endre z-indeksen.\n" +"Klikk på en annen flis for å redigere den." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Set Tile Region" @@ -10129,9 +10097,8 @@ msgid "Export Project" msgstr "Eksporter Prosjekt" #: editor/project_export.cpp -#, fuzzy msgid "Export mode?" -msgstr "Eksporter Prosjekt" +msgstr "Eksportmodus?" #: editor/project_export.cpp #, fuzzy @@ -10221,8 +10188,8 @@ msgid "" "Couldn't load project.godot in project path (error %d). It may be missing or " "corrupted." msgstr "" -"Kunne ikke laste project.godot i prosjekt sti (error %d). Den kan være " -"manglet eller korruptert." +"Kunne ikke laste project.godot i prosjektstien (feil %d). Den kan mangle " +"eller være korrupt." #: editor/project_manager.cpp msgid "Couldn't edit project.godot in project path." @@ -10393,25 +10360,28 @@ msgid "Are you sure to run %d projects at once?" msgstr "Er du sikker på at du vil kjøre mer enn ett prosjekt?" #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove %d projects from the list?\n" "The project folders' contents won't be modified." -msgstr "Fjern prosjekt fra listen? (Mappeinnhold vil ikke bli modifisert)" +msgstr "" +"Fjern %s prosjekter fra listen?\n" +"Innhold i prosjektmappene vil ikke påvirkes." #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove this project from the list?\n" "The project folder's contents won't be modified." -msgstr "Fjern prosjekt fra listen? (Mappeinnhold vil ikke bli modifisert)" +msgstr "" +"Fjern dette prosjektet fra listen?\n" +"Innhold i prosjektmappen vil ikke påvirkes." #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove all missing projects from the list?\n" "The project folders' contents won't be modified." -msgstr "Fjern prosjekt fra listen? (Mappeinnhold vil ikke bli modifisert)" +msgstr "" +"Fjern alle manglende prosjekter fra listen?\n" +"Innhold i prosjektmappene vil ikke påvirkes." #: editor/project_manager.cpp msgid "" @@ -10438,6 +10408,11 @@ msgid "Projects" msgstr "Prosjekter" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "Henter fillager, vennligst vent..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10506,9 +10481,8 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -#, fuzzy msgid "An action with the name '%s' already exists." -msgstr "ERROR: Animasjonsnavnet finnes allerede!" +msgstr "En handling med navnet '%s' finnes allerede." #: editor/project_settings_editor.cpp msgid "Rename Input Action Event" @@ -10809,10 +10783,14 @@ msgstr "" msgid "Plugins" msgstr "Innstikkmoduler" -#: editor/property_editor.cpp +#: editor/project_settings_editor.cpp #, fuzzy +msgid "Import Defaults" +msgstr "Last Standard" + +#: editor/property_editor.cpp msgid "Preset..." -msgstr "Preset..." +msgstr "Forhåndsinnstilt..." #: editor/property_editor.cpp msgid "Zero" @@ -10873,9 +10851,8 @@ msgid "Batch Rename" msgstr "Endre navn" #: editor/rename_dialog.cpp -#, fuzzy msgid "Replace:" -msgstr "Erstatt: " +msgstr "Erstatt:" #: editor/rename_dialog.cpp msgid "Prefix:" @@ -10914,9 +10891,8 @@ msgid "Node type" msgstr "Finn Node Type" #: editor/rename_dialog.cpp -#, fuzzy msgid "Current scene name" -msgstr "Gjeldende scene er ikke lagret. Åpne likevel?" +msgstr "Navn på gjeldende scene" #: editor/rename_dialog.cpp #, fuzzy @@ -11068,6 +11044,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Lim inn Noder" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Nytt Skript" @@ -11106,14 +11091,12 @@ msgid "Make node as Root" msgstr "Lagre Scene" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes and any children?" -msgstr "Kutt Noder" +msgstr "Slett %d noder og eventuelle barn?" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes?" -msgstr "Kutt Noder" +msgstr "Slett %d noder?" #: editor/scene_tree_dock.cpp msgid "Delete the root node \"%s\"?" @@ -11124,9 +11107,8 @@ msgid "Delete node \"%s\" and its children?" msgstr "" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete node \"%s\"?" -msgstr "Kutt Noder" +msgstr "Slett noden \"%s\"?" #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." @@ -11197,6 +11179,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Kutt Noder" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -11413,19 +11400,16 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Path is empty." -msgstr "Ressurs-utklippstavle er tom!" +msgstr "Stien er tom." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Filename is empty." -msgstr "Ressurs-utklippstavle er tom!" +msgstr "Filnavnet er tomt." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Path is not local." -msgstr "Sti leder ikke Node!" +msgstr "Stien er ikke lokal." #: editor/script_create_dialog.cpp #, fuzzy @@ -11472,9 +11456,8 @@ msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Open Script / Choose Location" -msgstr "Åpne SkriptEditor" +msgstr "Åpne skript / Velg plassering" #: editor/script_create_dialog.cpp #, fuzzy @@ -11569,19 +11552,16 @@ msgid "Warning:" msgstr "Advarsler:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Error:" -msgstr "Error!" +msgstr "Feil:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "C++ Error" -msgstr "Last Errors" +msgstr "C++-feil" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "C++ Error:" -msgstr "Last Errors" +msgstr "C++-feil:" #: editor/script_editor_debugger.cpp #, fuzzy @@ -11612,9 +11592,8 @@ msgid "Child process connected." msgstr "Frakoblet" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Copy Error" -msgstr "Last Errors" +msgstr "Kopier feil" #: editor/script_editor_debugger.cpp msgid "Video RAM" @@ -11879,7 +11858,7 @@ msgstr "" #: modules/gdscript/gdscript_functions.cpp msgid "Not a script with an instance" -msgstr "" +msgstr "Ikke et skript med en instans" #: modules/gdscript/gdscript_functions.cpp msgid "Not based on a script" @@ -12245,25 +12224,24 @@ msgid "Name is not a valid identifier:" msgstr "Navn er ikke en gyldig identifikator:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Name already in use by another func/var/signal:" -msgstr "Navn er allerede i bruk av en annen func/var/signal:" +msgstr "Navnet er allerede i bruk av annen funk/var/signal:" #: modules/visual_script/visual_script_editor.cpp msgid "Rename Function" -msgstr "" +msgstr "Endre navn på funksjonen" #: modules/visual_script/visual_script_editor.cpp msgid "Rename Variable" -msgstr "" +msgstr "Endre navn på variabelen" #: modules/visual_script/visual_script_editor.cpp msgid "Rename Signal" -msgstr "" +msgstr "Endre navn på signalet" #: modules/visual_script/visual_script_editor.cpp msgid "Add Function" -msgstr "" +msgstr "Legg til funksjon" #: modules/visual_script/visual_script_editor.cpp #, fuzzy @@ -12272,11 +12250,11 @@ msgstr "Fjern punkt" #: modules/visual_script/visual_script_editor.cpp msgid "Add Variable" -msgstr "" +msgstr "Legg til variabel" #: modules/visual_script/visual_script_editor.cpp msgid "Add Signal" -msgstr "" +msgstr "Legg til signal" #: modules/visual_script/visual_script_editor.cpp #, fuzzy @@ -12290,7 +12268,7 @@ msgstr "Fjern punkt" #: modules/visual_script/visual_script_editor.cpp msgid "Change Expression" -msgstr "" +msgstr "Endre uttrykk" #: modules/visual_script/visual_script_editor.cpp msgid "Remove VisualScript Nodes" @@ -12310,6 +12288,8 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." msgstr "" +"Hold Ctrl for å slippe en Getter. Hold Skift for å slippe en generisk " +"signatur." #: modules/visual_script/visual_script_editor.cpp #, fuzzy @@ -12318,7 +12298,7 @@ msgstr "Hold Meta for å slippe en enkel referanse til noden." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a simple reference to the node." -msgstr "Hold Ctrl for å slippe en simpel referanse til noden." +msgstr "Hold Ctrl for å slippe en enkel referanse til noden." #: modules/visual_script/visual_script_editor.cpp #, fuzzy @@ -12438,19 +12418,19 @@ msgstr "Fjern Funksjon" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Variable" -msgstr "" +msgstr "Fjern variabel" #: modules/visual_script/visual_script_editor.cpp msgid "Editing Variable:" -msgstr "" +msgstr "Redigerer variabel:" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Signal" -msgstr "" +msgstr "Fjern signal" #: modules/visual_script/visual_script_editor.cpp msgid "Editing Signal:" -msgstr "" +msgstr "Redigerer signal:" #: modules/visual_script/visual_script_editor.cpp #, fuzzy @@ -12544,7 +12524,7 @@ msgstr "Sti leder ikke Node!" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Invalid index property name '%s' in node %s." -msgstr "Ugyldig indeks egenskap navn '%s' i node %s." +msgstr "Ugyldig navn for indeksegenskap '%s' i noden %s." #: modules/visual_script/visual_script_nodes.cpp msgid ": Invalid argument of type: " @@ -12894,6 +12874,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -13082,9 +13070,8 @@ msgid "Saving lightmaps" msgstr "Genererer Lyskart" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Done" -msgstr "Ferdig!" +msgstr "Ferdig" #: scene/3d/collision_object.cpp msgid "" @@ -13152,11 +13139,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13286,9 +13268,8 @@ msgid "In node '%s', invalid animation: '%s'." msgstr "" #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Invalid animation: '%s'." -msgstr "ERROR: Ugyldig animasjonsnavn!" +msgstr "Ugyldig animasjon: '%s'." #: scene/animation/animation_tree.cpp #, fuzzy diff --git a/editor/translations/nl.po b/editor/translations/nl.po index 22b3202945..52c63ffa85 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -28,7 +28,7 @@ # rxadmin <r.van.eeghem@gmail.com>, 2018. # Peter Goelst <muis24@gmail.com>, 2019. # Wouter Buckens <wou.buc@gmail.com>, 2019. -# Stijn Hinlopen <f.a.hinlopen@gmail.com>, 2019, 2020. +# Stijn Hinlopen <f.a.hinlopen@gmail.com>, 2019, 2020, 2021. # jef dered <themen098s@vivaldi.net>, 2019. # Alex H. <sandertjeh13@hotmail.com>, 2019. # edouardgr <edouard.gruyters@gmail.com>, 2019. @@ -47,7 +47,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-12-25 12:29+0000\n" +"PO-Revision-Date: 2021-02-05 23:44+0000\n" "Last-Translator: Stijn Hinlopen <f.a.hinlopen@gmail.com>\n" "Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot/" "nl/>\n" @@ -56,7 +56,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 4.4.1-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -686,7 +686,7 @@ msgstr "Selecteer sporen om te kopieren" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopiëren" @@ -1703,7 +1703,7 @@ msgstr "Script Editor" #: editor/editor_feature_profile.cpp msgid "Asset Library" -msgstr "Asset bibliotheek" +msgstr "Materiaalbibliotheek" #: editor/editor_feature_profile.cpp msgid "Scene Tree Editing" @@ -1899,8 +1899,8 @@ msgid "Open a File or Directory" msgstr "Bestand of map openen" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Opslaan" @@ -2430,7 +2430,7 @@ msgstr "Er is geen startscène ingesteld." #: editor/editor_node.cpp msgid "Save scene before running..." -msgstr "" +msgstr "Scène opslaan voor het afspelen..." #: editor/editor_node.cpp msgid "Could not start subprocess!" @@ -2577,7 +2577,8 @@ msgstr "" "mislukt." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Onmogelijk om scriptveld te vinden voor de plugin op: 'res://addons/%s'." @@ -2901,7 +2902,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Visible Collision Shapes" -msgstr "Toon collision shapes" +msgstr "Botsingsvormen tonen" #: editor/editor_node.cpp #, fuzzy @@ -3011,14 +3012,6 @@ msgid "Help" msgstr "Help" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Zoeken" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Online Documentatie" @@ -3185,6 +3178,25 @@ msgid "Open & Run a Script" msgstr "Voer Een Script Uit" #: editor/editor_node.cpp +#, fuzzy +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"De volgende bestanden zijn nieuwer op de schijf.\n" +"Welke aktie moet worden genomen?:" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Herladen" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Heropslaan" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Nieuw afgeleid type" @@ -3210,7 +3222,7 @@ msgstr "Open Script Bewerker" #: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" -msgstr "Open Asset Bibliotheek" +msgstr "Open Materiaalbibliotheek" #: editor/editor_node.cpp msgid "Open the next Editor" @@ -3396,7 +3408,7 @@ msgstr "Maak Uniek" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Plakken" @@ -3758,6 +3770,11 @@ msgid "" "\n" "Do you wish to overwrite them?" msgstr "" +"De volgende bestanden of mappen conflicteren met elementen in '%s':\n" +"\n" +"%s\n" +"\n" +"Wil je deze overschrijven?" #: editor/filesystem_dock.cpp msgid "Renaming file:" @@ -3950,19 +3967,16 @@ msgid "Searching..." msgstr "Aan het zoeken..." #: editor/find_in_files.cpp -#, fuzzy msgid "%d match in %d file." -msgstr "%d overeenkomst(en) gevonden." +msgstr "%d overeenkomst in %d bestand." #: editor/find_in_files.cpp -#, fuzzy msgid "%d matches in %d file." -msgstr "%d overeenkomst(en) gevonden." +msgstr "%d overeenkomsten in %d bestand." #: editor/find_in_files.cpp -#, fuzzy msgid "%d matches in %d files." -msgstr "%d overeenkomst(en) gevonden." +msgstr "%d overeenkomsten in %d bestanden." #: editor/groups_editor.cpp msgid "Add to Group" @@ -4099,6 +4113,21 @@ msgstr "" msgid "Saving..." msgstr "Opslaan..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Selecteermodus" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importeren" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Laad standaard" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Bestanden" @@ -5066,7 +5095,8 @@ msgid "Got:" msgstr "Gekregen:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "SHA256-proef mislukt" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5170,7 +5200,6 @@ msgid "Sort:" msgstr "Sorteren op:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Categorie:" @@ -5242,9 +5271,8 @@ msgid "Bake Lightmaps" msgstr "Bak Lichtmappen" #: editor/plugins/baked_lightmap_editor_plugin.cpp -#, fuzzy msgid "Select lightmap bake file:" -msgstr "Selecteer sjabloonbestand" +msgstr "Selecteer lightmap bake-bestand" #: editor/plugins/camera_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5313,7 +5341,7 @@ msgstr "Maak nieuwe horizontale en verticale gidsen" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Set CanvasItem \"%s\" Pivot Offset to (%d, %d)" -msgstr "" +msgstr "Draaipuntverschuiving van het CanvasItem „%s“ op (%d, %d) zetten" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotate %d CanvasItems" @@ -5336,24 +5364,20 @@ msgid "Resize Control \"%s\" to (%d, %d)" msgstr "Control \"%s\" vergrootten tot (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Scale %d CanvasItems" -msgstr "Schaal CanvasItem" +msgstr "Schaal %d CanvasItems" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Scale CanvasItem \"%s\" to (%s, %s)" -msgstr "Schaal CanvasItem" +msgstr "Schaal CanvasItem \"%s\" naar (%s, %s)" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move %d CanvasItems" -msgstr "Verplaats CanvasItem" +msgstr "Verplaats %d CanvasItems" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move CanvasItem \"%s\" to (%d, %d)" -msgstr "Verplaats CanvasItem" +msgstr "CanvasItem \"%s\" naar (%d, %d) verplaatsen" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -6347,9 +6371,8 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "Kan punt alleen plaatsen in een PartikelsMateriaal proces materiaal" #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Convert to CPUParticles2D" -msgstr "Zet om in CPUParticles" +msgstr "Omzetten naar CPUParticles2D" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp @@ -6640,9 +6663,8 @@ msgid "Move Points" msgstr "Beweeg Punten" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Command: Rotate" -msgstr "Sleep: Roteer" +msgstr "Ctrl: Roteer" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Shift: Move All" @@ -6700,14 +6722,12 @@ msgid "Radius:" msgstr "Radius:" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Copy Polygon to UV" -msgstr "Creëer Polygon & UV" +msgstr "Kopieer Polygon naar UV" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Copy UV to Polygon" -msgstr "Naar Polygon2D omzetten" +msgstr "Kopieer UV naar Polygon2D" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Clear UV" @@ -7009,6 +7029,14 @@ msgstr "Sluit Docs" msgid "Run" msgstr "Uitvoeren" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Zoeken" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Stap In" @@ -7062,16 +7090,6 @@ msgstr "" "De volgende bestanden zijn nieuwer op de schijf.\n" "Welke aktie moet worden genomen?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Herladen" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Heropslaan" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Debugger" @@ -7165,8 +7183,8 @@ msgstr "Breekpunten" msgid "Go To" msgstr "Ga Naar" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Knippen" @@ -7389,6 +7407,11 @@ msgid "Yaw" msgstr "Yaw" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Size" +msgstr "Grootte: " + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "Objecten Getekend" @@ -7801,7 +7824,7 @@ msgstr "Polygon2D Voorbeeldweergave" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create CollisionPolygon2D" -msgstr "Creëer CollisionPolygon2D" +msgstr "CollisionPolygon2D aanmaken" #: editor/plugins/sprite_editor_plugin.cpp msgid "CollisionPolygon2D Preview" @@ -7843,11 +7866,11 @@ msgstr "Naar Polygon2D omzetten" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create collision polygon." -msgstr "Ongeldige geometrie, kan geen collision polygoon creëren." +msgstr "Ongeldige geometrie, kan geen botsingspolygoon aanmaken." #: editor/plugins/sprite_editor_plugin.cpp msgid "Create CollisionPolygon2D Sibling" -msgstr "Creëer CollisionPolygon2D Sibling" +msgstr "CollisionPolygon2D aanmaken" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create light occluder." @@ -8253,13 +8276,12 @@ msgid "Paint Tile" msgstr "Teken Tegel" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "" "Shift+LMB: Line Draw\n" "Shift+Command+LMB: Rectangle Paint" msgstr "" -"Shift+LMB: Lijn Tekenen\n" -"Shift+Ctrl+LMB: Vierkant Tekenen" +"Shift+LMB: Lijn tekenen\n" +"Shift+Ctrl+LMB: Vierkant tekenen" #: editor/plugins/tile_map_editor_plugin.cpp msgid "" @@ -8414,23 +8436,20 @@ msgid "Create a new rectangle." msgstr "Creëer nieuwe driehoek." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "New Rectangle" -msgstr "Teken Driehoek" +msgstr "Nieuwe rechthoek" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create a new polygon." msgstr "Nieuwe veelhoek aanmaken." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "New Polygon" -msgstr "Beweeg Polygon" +msgstr "Nieuwe veelhoek" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Delete Selected Shape" -msgstr "Geselecteerde Verwijderen" +msgstr "Geselecteerde vormen verwijderen" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Keep polygon inside region Rect." @@ -8557,7 +8576,7 @@ msgstr "Tegelbitmasker bewerken" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Edit Collision Polygon" -msgstr "Bewerk Collision Polygon" +msgstr "Botsingspolygoon aanpassen" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Edit Occlusion Polygon" @@ -8589,7 +8608,7 @@ msgstr "Verwijder Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove Collision Polygon" -msgstr "Verwijder Collision Polygon" +msgstr "Botsingsvorm verwijderen" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove Occlusion Polygon" @@ -8617,7 +8636,7 @@ msgstr "Maak concaaf" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create Collision Polygon" -msgstr "Creëer Collision Polygon" +msgstr "Botsingsvorm aanmaken" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create Occlusion Polygon" @@ -8795,9 +8814,8 @@ msgid "Add Node to Visual Shader" msgstr "VisualShader-knoop toevoegen" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Node(s) Moved" -msgstr "Knoop verplaatst" +msgstr "Knoop/knopen verplaatst" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Duplicate Nodes" @@ -8817,9 +8835,8 @@ msgid "Visual Shader Input Type Changed" msgstr "Visuele Shader Invoertype Gewijzigd" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "UniformRef Name Changed" -msgstr "Uniforme naam instellen" +msgstr "UniformRef naam veranderd" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" @@ -9547,7 +9564,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "A reference to an existing uniform." -msgstr "" +msgstr "Een verwijzing naar een bestaande uniform." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(Fragment/Light mode only) Scalar derivative function." @@ -9914,7 +9931,7 @@ msgstr "OpenGL ES 3.0" #: editor/project_manager.cpp msgid "Not supported by your GPU drivers." -msgstr "" +msgstr "Niet ondersteund door de GPU drivers op dit systeem." #: editor/project_manager.cpp msgid "" @@ -10093,6 +10110,11 @@ msgid "Projects" msgstr "Projecten" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "Mirrors ophalen, even wachten a.u.b..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "Laatst bewerkt" @@ -10130,7 +10152,7 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" "U heeft momenteel geen projecten.\n" -"Wilt u de officiële voorbeeldprojecten verkennen in de Asset Library?" +"Wilt u officiële voorbeeldprojecten verkennen in de Materiaalbibliotheek?" #: editor/project_manager.cpp msgid "" @@ -10463,6 +10485,11 @@ msgstr "Automatisch Laden" msgid "Plugins" msgstr "Plugins" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Laad standaard" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Voorinstelling..." @@ -10524,19 +10551,16 @@ msgid "Batch Rename" msgstr "Bulk hernoemen" #: editor/rename_dialog.cpp -#, fuzzy msgid "Replace:" -msgstr "Vervangen: " +msgstr "Vervangen:" #: editor/rename_dialog.cpp -#, fuzzy msgid "Prefix:" -msgstr "Voorvoegsel" +msgstr "Voorvoegsel:" #: editor/rename_dialog.cpp -#, fuzzy msgid "Suffix:" -msgstr "Achtervoegsel" +msgstr "Achtervoegsel:" #: editor/rename_dialog.cpp msgid "Use Regular Expressions" @@ -10583,11 +10607,10 @@ msgid "Per-level Counter" msgstr "Per niveau teller" #: editor/rename_dialog.cpp -#, fuzzy msgid "If set, the counter restarts for each group of child nodes." msgstr "" -"Indien ingesteld: herstart de teller voor iedere groep van onderliggende " -"knopen" +"Indien ingesteld, zal de teller voor iedere groep van onderliggende knopen " +"opnieuw starten." #: editor/rename_dialog.cpp msgid "Initial value for the counter" @@ -10646,9 +10669,8 @@ msgid "Reset" msgstr "Resetten" #: editor/rename_dialog.cpp -#, fuzzy msgid "Regular Expression Error:" -msgstr "Fout in reguliere expressie" +msgstr "Fout in reguliere expressie:" #: editor/rename_dialog.cpp msgid "At character %s" @@ -10719,6 +10741,16 @@ msgid "Instance Child Scene" msgstr "Scène instantiëren" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Kan deze operatie niet uitvoeren op knopen uit een vreemde scène!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Knopen plakken" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Script losmaken" @@ -10846,6 +10878,11 @@ msgid "Attach Script" msgstr "Script toevoegen" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Knopen knippen" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Verwijder knoop/knopen" @@ -11653,36 +11690,31 @@ msgstr "Voeg een MeshLibrary aan deze GridMap toe om meshes te gebruiken." #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Begin Bake" -msgstr "" +msgstr "Begin lichtberekening" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Preparing data structures" -msgstr "" +msgstr "Datastructuren worden voorbereid" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Generate buffers" -msgstr "Genereer AABB" +msgstr "Genereer buffers" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Direct lighting" -msgstr "Richtingen" +msgstr "Directe verlichting" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Indirect lighting" -msgstr "Rechts Inspringen" +msgstr "Indirecte verlichting" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Post processing" -msgstr "Post-Process" +msgstr "Nabewerking" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Plotting lightmaps" -msgstr "Plotten Light:" +msgstr "Lightmaps plotten" #: modules/mono/csharp_script.cpp msgid "Class name can't be a reserved keyword" @@ -12202,7 +12234,7 @@ msgstr "Selecteer apparaat uit de lijst" #: platform/android/export/export.cpp msgid "Unable to find the 'apksigner' tool." -msgstr "" +msgstr "Het hulpmiddel 'apksigner' kon niet gevonden worden." #: platform/android/export/export.cpp msgid "" @@ -12221,18 +12253,17 @@ msgid "Release keystore incorrectly configured in the export preset." msgstr "Release-Keystore is verkeerd ingesteld in de exportinstelingen." #: platform/android/export/export.cpp -#, fuzzy msgid "A valid Android SDK path is required in Editor Settings." -msgstr "Ongeldig Android SDK pad voor custom build in Editor Settings." +msgstr "" +"Een geldig Android SDK-pad moet in de Editorinstellingen ingesteld zijn." #: platform/android/export/export.cpp -#, fuzzy msgid "Invalid Android SDK path in Editor Settings." -msgstr "Ongeldig Android SDK pad voor custom build in Editor Settings." +msgstr "Ongeldig Android SDK-pad in Editorinstellingen." #: platform/android/export/export.cpp msgid "Missing 'platform-tools' directory!" -msgstr "" +msgstr "'platform-tools' map ontbreekt!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK platform-tools' adb command." @@ -12491,10 +12522,10 @@ msgid "" "Consider adding a CollisionShape2D or CollisionPolygon2D as a child to " "define its shape." msgstr "" -"Deze knoop heeft geen vorm (Shape), dus kan het niet met andere objecten " -"botsen of interactie hebben.\n" -"Overweeg om een CollisionShape2D of CollisionPolygon2D als kind toe te " -"voegen om de vorm ervan vast te leggen." +"Deze knoop heeft geen botsingsvorm als onderliggende knoop en kan dus niet " +"met andere objecten botsen of interageren.\n" +"Plaats hieronder een knoop als CollisionShape2D of CollisionPolygon2D om " +"deze vorm vast te leggen." #: scene/2d/collision_polygon_2d.cpp msgid "" @@ -12502,13 +12533,22 @@ msgid "" "CollisionObject2D derived node. Please only use it as a child of Area2D, " "StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionPolygon2D dient enkel om een botsingsvorm te koppelen aan een knoop " -"afgeleid van CollisionObject2D. Plaats hem onder een Area2D-, StaticBody2D-, " -"RigidBody2D- of KinematicBody2D-knoop." +"Een knooppunt van het type CollisionPolygon2D kan alleen een botsingsvorm " +"keveren aan knopen die zijn afgeleid van CollisionObject2D. Plaats het dus " +"alleen onder een knoop als Area2D, StaticBody2D, RigidBody2D of " +"KinematicBody2D." #: scene/2d/collision_polygon_2d.cpp msgid "An empty CollisionPolygon2D has no effect on collision." -msgstr "Een lege CollisionPolygon2D heeft geen effect op botsingen." +msgstr "Lege CollisionPolygon2D hebben geen botsingsfunctie." + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" #: scene/2d/collision_shape_2d.cpp msgid "" @@ -12516,15 +12556,16 @@ msgid "" "CollisionObject2D derived node. Please only use it as a child of Area2D, " "StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionShape2D dient enkel om een botsingsvorm te koppelen aan een knoop " -"afgeleid van CollisionObject2D. Plaats hem onder een Area2D-, StaticBody2D-, " -"RigidBody2D- of KinematicBody2D-knoop." +"Een knooppunt van het type CollisionShape2D kan alleen een botsingsvorm " +"keveren aan knopen die zijn afgeleid van CollisionObject2D. Plaats het dus " +"alleen onder een knoop als Area2D, StaticBody2D, RigidBody2D of " +"KinematicBody2D." #: scene/2d/collision_shape_2d.cpp msgid "" "A shape must be provided for CollisionShape2D to function. Please create a " "shape resource for it!" -msgstr "Een CollisionShape2D heeft een vorm nodig in de Shape-eigenschap!" +msgstr "Een CollisionShape2D heeft een vorm nodig." #: scene/2d/collision_shape_2d.cpp msgid "" @@ -12640,9 +12681,9 @@ msgid "" "by the physics engine when running.\n" "Change the size in children collision shapes instead." msgstr "" -"Grootteveranderingen van een RigidBody2D (in Character- of Rigidmodus) zal " -"overschreven worden door de physics engine als het spel start.\n" -"Verander in plaats daarvan de grootte van CollisionShapes in de kinderen." +"De grootte van een RigidBody2D (in Character- of Rigidmodus) wordt " +"overschreven wanneer het spel start.\n" +"Verander in plaats daarvan de grootte van de onderliggende botsingsvormen." #: scene/2d/remote_transform_2d.cpp msgid "Path property must point to a valid Node2D node to work." @@ -12671,10 +12712,9 @@ msgid "" "to. Please use it as a child of Area2D, StaticBody2D, RigidBody2D, " "KinematicBody2D, etc. to give them a shape." msgstr "" -"TileMap met de optie \"Use Parent\" aan heeft een CollisionShape2D-ouder " -"nodig om vormen aan te geven. De TileMap hoort een kind van een Area2D, " -"StaticBody2D, RigidBody2D, KinematicBody2D enz. knoop te zijn om ze een vorm " -"te geven." +"Een TileMap met de optie \"Use Parent\" ingeschakeld moet knoop afgeleid van " +"CollisionObject2D (Area2D, StaticBody2D, RigidBody2D of KinematicBody2D) als " +"ouder hebben." #: scene/2d/visibility_notifier_2d.cpp msgid "" @@ -12751,10 +12791,10 @@ msgid "" "Consider adding a CollisionShape or CollisionPolygon as a child to define " "its shape." msgstr "" -"Deze knoop heeft geen vorm (Shape), dus het kan niet met andere objecten " -"botsen of interactie hebben.\n" -"Overweeg om een CollisionShape of CollisionPolygon als kind toe te voegen om " -"de vorm ervan vast te leggen." +"Deze knoop heeft geen botsingsvorm als onderliggende knoop en kan dus niet " +"met andere objecten botsen of interageren.\n" +"Plaats hieronder een knoop als CollisionShape of CollisionPolygon om deze " +"vorm vast te leggen." #: scene/3d/collision_polygon.cpp msgid "" @@ -12762,13 +12802,13 @@ msgid "" "CollisionObject derived node. Please only use it as a child of Area, " "StaticBody, RigidBody, KinematicBody, etc. to give them a shape." msgstr "" -"CollisionPolygon dient enkel om een botsingsvorm te koppelen aan een knoop " -"afgeleid van CollisionObject. Plaats hem onder een Area-, StaticBody-, " -"RigidBody- of KinematicBody-knoop." +"Een knooppunt van het type CollisionPolygon kan alleen een botsingsvorm " +"keveren aan knopen die zijn afgeleid van CollisionObject. Plaats het dus " +"alleen onder een knoop als Area, StaticBody, RigidBody of KinematicBody." #: scene/3d/collision_polygon.cpp msgid "An empty CollisionPolygon has no effect on collision." -msgstr "Een lege CollisionPolygon heeft geen effect op botsingen." +msgstr "Lege CollisionPolygon hebben geen botsingsfunctie." #: scene/3d/collision_shape.cpp msgid "" @@ -12776,17 +12816,15 @@ msgid "" "derived node. Please only use it as a child of Area, StaticBody, RigidBody, " "KinematicBody, etc. to give them a shape." msgstr "" -"CollisionShape dient enkel om een botsingsvorm te koppelen aan een knoop " -"afgeleid van CollisionObject. Plaats hem onder een Area-, StaticBody-, " -"RigidBody- of KinematicBody-knoop." +"Een knooppunt van het type CollisionShape kan alleen een botsingsvorm " +"keveren aan knopen die zijn afgeleid van CollisionObject2D. Plaats het dus " +"alleen onder een knoop als Area, StaticBody, RigidBody of KinematicBody." #: scene/3d/collision_shape.cpp msgid "" "A shape must be provided for CollisionShape to function. Please create a " "shape resource for it." -msgstr "" -"Om CollisionShape te laten werken, hoort het een Shape te hebben. Maak " -"hiervoor alstublieft een Shape bron aan." +msgstr "Een CollisionShape heeft een vorm nodig." #: scene/3d/collision_shape.cpp msgid "" @@ -12829,11 +12867,6 @@ msgstr "" "GIProbes worden niet ondersteund door het GLES2 grafische stuurprogramma.\n" "Gebruik in plaats daarvan een BakedLightmap." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -12895,9 +12928,9 @@ msgid "" "by the physics engine when running.\n" "Change the size in children collision shapes instead." msgstr "" -"Grootteveranderingen van een RigidBody (in Character- of Rigidmodus) zal " -"overschreven worden door de physics engine als het spel start.\n" -"Verander in plaats daarvan de grootte van CollisionShapes in de kinderen." +"De grootte van een RigidBody (in Character- of Rigidmodus) wordt " +"overschreven wanneer het spel start.\n" +"Verander in plaats daarvan de grootte van de onderliggende botsingsvormen." #: scene/3d/physics_joint.cpp msgid "Node A and Node B must be PhysicsBodies" @@ -12937,9 +12970,8 @@ msgid "" "running.\n" "Change the size in children collision shapes instead." msgstr "" -"Grootteveranderingen van een SoftBody (in Character- of Rigidmodus) zal " -"overschreven worden door de physics engine als het spel start.\n" -"Verander de grootte van CollisionShapes in de kinderen." +"De grootte van een SoftBody wordt overschreven wanneer het spel start.\n" +"Verander in plaats daarvan de grootte van de onderliggende botsingsvormen." #: scene/3d/sprite_3d.cpp msgid "" @@ -13084,9 +13116,8 @@ msgid "Must use a valid extension." msgstr "Een geldige extensie moet gebruikt worden." #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Enable grid minimap." -msgstr "Aan raster kleven" +msgstr "Rasteroverzicht inschakelen." #: scene/gui/popup.cpp msgid "" diff --git a/editor/translations/or.po b/editor/translations/or.po index c1bc32d40f..19b87260d6 100644 --- a/editor/translations/or.po +++ b/editor/translations/or.po @@ -625,7 +625,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1794,8 +1794,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -2429,7 +2429,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2819,14 +2819,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -2980,6 +2972,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3182,7 +3190,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3863,6 +3871,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4810,7 +4830,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4914,7 +4934,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6681,6 +6700,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6732,16 +6759,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -6834,8 +6851,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7056,6 +7073,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9576,6 +9597,10 @@ msgid "Projects" msgstr "" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -9936,6 +9961,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10179,6 +10208,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10299,6 +10336,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -11873,6 +11914,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12128,11 +12177,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/pl.po b/editor/translations/pl.po index 6372cedd0a..d55fee8b72 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -46,12 +46,13 @@ # Dzejkop <jakubtrad@gmail.com>, 2020. # Mateusz Grzonka <alpinus4@gmail.com>, 2020. # gnu-ewm <gnu.ewm@protonmail.com>, 2021. +# vrid <patryksoon@live.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-01-26 03:28+0000\n" -"Last-Translator: gnu-ewm <gnu.ewm@protonmail.com>\n" +"PO-Revision-Date: 2021-03-10 22:14+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" @@ -60,7 +61,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -688,7 +689,7 @@ msgstr "Wybierz ścieżki do skopiowania" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopiuj" @@ -1890,8 +1891,8 @@ msgid "Open a File or Directory" msgstr "Otwórz plik lub katalog" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Zapisz" @@ -2562,8 +2563,8 @@ msgstr "" "Nie można włączyć dodatku: \"%s\" - parsowanie konfiguracji nie powiodło się." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "Nie można odnaleźć pola skryptu w dodatku: \"res://addons/%s\"." +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "Nie można odnaleźć pola skryptu w dodatku: \"%s\"." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2993,14 +2994,6 @@ msgid "Help" msgstr "Pomoc" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Szukaj" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Dokumentacja online" @@ -3164,6 +3157,24 @@ msgid "Open & Run a Script" msgstr "Otwórz i Uruchom Skrypt" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"Następujące pliki są nowsze na dysku.\n" +"Jakie działanie powinno zostać podjęte?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Przeładuj" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Zapisz ponownie" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Nowa dziedzicząca scena" @@ -3374,7 +3385,7 @@ msgstr "Zrób unikalny" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Wklej" @@ -4080,6 +4091,18 @@ msgstr "Czy zwracasz obiekt dziedziczący po Node w metodzie `post_import()`?" msgid "Saving..." msgstr "Zapisywanie..." +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "Wybierz importer" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "Importer:" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "Resetuj do domyślnych" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d plików" @@ -5048,8 +5071,8 @@ msgid "Got:" msgstr "Otrzymano:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" -msgstr "Nie udało się przeprowadzić testu integralności sha256" +msgid "Failed SHA-256 hash check" +msgstr "Test SHA-256 nieudany" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5152,7 +5175,6 @@ msgid "Sort:" msgstr "Sortuj:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategoria:" @@ -6979,6 +7001,14 @@ msgstr "Zamknij pliki pomocy" msgid "Run" msgstr "Uruchom" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Szukaj" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Krok w" @@ -7032,16 +7062,6 @@ msgstr "" "Następujące pliki są nowsze na dysku.\n" "Jakie działania powinny zostać podjęte?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Przeładuj" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Zapisz ponownie" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Debugger" @@ -7137,8 +7157,8 @@ msgstr "Punkty wstrzymania" msgid "Go To" msgstr "Idź do" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Wytnij" @@ -7361,6 +7381,10 @@ msgid "Yaw" msgstr "Odchylenie" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "Rozmiar" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "Narysowane obiekty" @@ -8536,7 +8560,7 @@ msgstr "Edytuj wielokąt nawigacji" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Paste Tile Bitmask" -msgstr "Wklej maskę bitową Kafelka" +msgstr "Wklej maskę bitową kafelka" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Clear Tile Bitmask" @@ -10046,6 +10070,10 @@ msgid "Projects" msgstr "Projekty" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "Wczytywanie, proszę czekać..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "Data modyfikacji" @@ -10154,15 +10182,15 @@ msgstr "Indeks przycisku myszy:" #: editor/project_settings_editor.cpp msgid "Left Button" -msgstr "Lewy guzik" +msgstr "Lewy przycisk" #: editor/project_settings_editor.cpp msgid "Right Button" -msgstr "Prawy guzik" +msgstr "Prawy przycisk" #: editor/project_settings_editor.cpp msgid "Middle Button" -msgstr "Środkowy guzik" +msgstr "Środkowy przycisk" #: editor/project_settings_editor.cpp msgid "Wheel Up Button" @@ -10416,6 +10444,10 @@ msgstr "Autoładowanie" msgid "Plugins" msgstr "Wtyczki" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "Importuj domyślne" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Ustawienie predefiniowane..." @@ -10665,6 +10697,14 @@ msgid "Instance Child Scene" msgstr "Dodaj instancję sceny" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "Nie można wkleić korzenia do tej samej sceny." + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "Wklej węzeł/y" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Odłącz skrypt" @@ -10791,6 +10831,10 @@ msgid "Attach Script" msgstr "Dołącz skrypt" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "Wytnij węzeł/y" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Usuń węzeł(y)" @@ -12160,18 +12204,12 @@ msgstr "" "Wydaniowy keystore jest niepoprawnie skonfigurowany w profilu eksportu." #: platform/android/export/export.cpp -#, fuzzy msgid "A valid Android SDK path is required in Editor Settings." -msgstr "" -"Niepoprawna ścieżka do SDK Androida dla własnego builda w Ustawieniach " -"Edytora." +msgstr "Wymagana jest poprawna ścieżka SDK Androida w Ustawieniach Edytora." #: platform/android/export/export.cpp -#, fuzzy msgid "Invalid Android SDK path in Editor Settings." -msgstr "" -"Niepoprawna ścieżka do SDK Androida dla własnego builda w Ustawieniach " -"Edytora." +msgstr "Niepoprawna ścieżka do SDK Androida w Ustawieniach Edytora." #: platform/android/export/export.cpp msgid "Missing 'platform-tools' directory!" @@ -12180,13 +12218,11 @@ msgstr "Folder \"platform-tools\" nie istnieje!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK platform-tools' adb command." msgstr "" +"Nie udało się znaleźć komendy adb z narzędzi platformowych SDK Androida." #: platform/android/export/export.cpp -#, fuzzy msgid "Please check in the Android SDK directory specified in Editor Settings." -msgstr "" -"Niepoprawna ścieżka do SDK Androida dla własnego builda w Ustawieniach " -"Edytora." +msgstr "Sprawdź w folderze SDK Androida podanych w Ustawieniach Edytora." #: platform/android/export/export.cpp msgid "Missing 'build-tools' directory!" @@ -12194,7 +12230,7 @@ msgstr "Brakuje folderu \"build-tools\"!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK build-tools' apksigner command." -msgstr "" +msgstr "Nie udało się znaleźć komendy apksigner z narzędzi SDK Androida." #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." @@ -12460,6 +12496,18 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Pusty CollisionPolygon2D nie ma wpływu na kolizje." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" +"Nieprawidłowy wielokąt. Co najmniej 3 punkty są potrzebne do trybu budowania " +"\"Solids\"." + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" +"Nieprawidłowy wielokąt. Co najmniej 3 punkty są potrzebne do trybu budowania " +"\"Segments\"." + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12672,27 +12720,23 @@ msgstr "ARVROrigin wymaga węzła potomnego typu ARVRCamera." #: scene/3d/baked_lightmap.cpp msgid "Finding meshes and lights" -msgstr "" +msgstr "Szukanie siatek i świateł" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing geometry (%d/%d)" -msgstr "Parsowanie Geometrii..." +msgstr "Przygotowywanie geometrii (%d/%d)" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing environment" -msgstr "Wyświetlaj środowisko" +msgstr "Przygotowywanie środowiska" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Generating capture" -msgstr "Generowanie Lightmapy" +msgstr "Generowanie przechwycenia" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Saving lightmaps" -msgstr "Generowanie Lightmapy" +msgstr "Zapisywanie map światła" #: scene/3d/baked_lightmap.cpp msgid "Done" @@ -12785,12 +12829,6 @@ msgstr "" "GIProbes nie są obsługiwane przez sterownik wideo GLES2.\n" "Zamiast tego użyj BakedLightmap." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" -"Węzeł InterpolatedCamera jest przestarzały i będzie usunięty w Godocie 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "SpotLight z kątem szerszym niż 90 stopni nie może rzucać cieni." @@ -13099,6 +13137,8 @@ msgid "" "The sampler port is connected but not used. Consider changing the source to " "'SamplerPort'." msgstr "" +"Port samplera jest podłączony, ale nieużyty. Rozważ zmianę źródła na " +"\"SamplerPort\"." #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." @@ -13128,6 +13168,12 @@ msgstr "Varying może być przypisane tylko w funkcji wierzchołków." msgid "Constants cannot be modified." msgstr "Stałe nie mogą być modyfikowane." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "" +#~ "Węzeł InterpolatedCamera jest przestarzały i będzie usunięty w Godocie " +#~ "4.0." + #~ msgid "No" #~ msgstr "Nie" @@ -14748,9 +14794,6 @@ msgstr "Stałe nie mogą być modyfikowane." #~ msgid "Use Default Light" #~ msgstr "Użyj domyślnego światła" -#~ msgid "Use Default sRGB" -#~ msgstr "Użyj domyślnie sRGB" - #~ msgid "Ambient Light Color:" #~ msgstr "Kolor światła otoczenia:" diff --git a/editor/translations/pr.po b/editor/translations/pr.po index 9f6933a077..09d967e01d 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -656,7 +656,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1862,8 +1862,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -2510,7 +2510,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2911,14 +2911,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3075,6 +3067,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3283,7 +3291,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3996,6 +4004,19 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Slit th' Node" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -4979,7 +5000,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5083,7 +5104,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6901,6 +6921,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6953,16 +6981,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -7059,8 +7077,8 @@ msgstr "Yar, Blow th' Selected Down!" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7293,6 +7311,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9911,6 +9933,10 @@ msgid "Projects" msgstr "Rename Function" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10277,6 +10303,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10525,6 +10555,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Paste yer Node" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Discharge ye' Variable" @@ -10650,6 +10689,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Slit th' Node" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -12318,6 +12362,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12573,11 +12625,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/pt.po b/editor/translations/pt.po index 24cd684ee9..dd745d7c56 100644 --- a/editor/translations/pt.po +++ b/editor/translations/pt.po @@ -22,7 +22,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-01-26 03:28+0000\n" +"PO-Revision-Date: 2021-03-10 22:14+0000\n" "Last-Translator: João Lopes <linux-man@hotmail.com>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/godot-engine/" "godot/pt/>\n" @@ -31,7 +31,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 4.5-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -661,7 +661,7 @@ msgstr "Selecionar Pistas a Copiar" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Copiar" @@ -1867,8 +1867,8 @@ msgid "Open a File or Directory" msgstr "Abrir um Ficheiro ou Diretoria" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Guardar" @@ -2542,8 +2542,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "Incapaz de ativar plugin em: '%s' falha de análise ou configuração." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "Incapaz de localizar campo Script para plugin em: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "Incapaz de localizar campo script para plugin em: '%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2975,14 +2975,6 @@ msgid "Help" msgstr "Ajuda" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Procurar" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Documentação Online" @@ -3147,6 +3139,24 @@ msgid "Open & Run a Script" msgstr "Abrir & Executar um Script" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"Os seguintes ficheiros são mais recentes no disco.\n" +"Que ação deve ser tomada?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Recarregar" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Guardar novamente" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Novo Herdado" @@ -3357,7 +3367,7 @@ msgstr "Fazer único" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Colar" @@ -4064,6 +4074,18 @@ msgstr "Devolveu um objeto derivado de Nó no método `post_import()`?" msgid "Saving..." msgstr "A guardar..." +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "Selecionar Importador" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "Importador:" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "Restaurar Predefinições" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Ficheiros" @@ -5030,8 +5052,8 @@ msgid "Got:" msgstr "Obtido:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" -msgstr "Verificação hash sha256 falhada" +msgid "Failed SHA-256 hash check" +msgstr "Falhou a verificação hash SHA-256" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5134,7 +5156,6 @@ msgid "Sort:" msgstr "Ordenar:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Categoria:" @@ -6955,6 +6976,14 @@ msgstr "Fechar documentos" msgid "Run" msgstr "Executar" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Procurar" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Passar Dentro" @@ -7008,16 +7037,6 @@ msgstr "" "Os seguintes Ficheiros são mais recentes no disco.\n" "Que ação deve ser tomada?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Recarregar" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Guardar novamente" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Depurador" @@ -7110,8 +7129,8 @@ msgstr "Pontos de paragem" msgid "Go To" msgstr "Ir Para" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Cortar" @@ -7334,6 +7353,10 @@ msgid "Yaw" msgstr "Direção" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "Tamanho" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "Objetos desenhados" @@ -10013,6 +10036,10 @@ msgid "Projects" msgstr "Projetos" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "A carregar, espere por favor..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "Última modificação" @@ -10383,6 +10410,10 @@ msgstr "Carregamento automático" msgid "Plugins" msgstr "Plugins" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "Importar Predefinições" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Predefinição..." @@ -10632,6 +10663,14 @@ msgid "Instance Child Scene" msgstr "Instanciar Cena Filha" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "Não consigo colar o nó raiz na mesma cena." + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "Colar Nó(s)" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Separar Script" @@ -10758,6 +10797,10 @@ msgid "Attach Script" msgstr "Anexar Script" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "Cortar Nó(s)" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Remover Nó(s)" @@ -12423,6 +12466,18 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Um CollisionPolygon2D vazio não tem efeito na colisão." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" +"Polígono inválido. São precisos pelo menos 3 pontos no modo de construção " +"'Sólidos'." + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" +"Polígono inválido. São precisos pelo menos 2 pontos no modo de construção " +"'Segmentos'." + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12736,11 +12791,6 @@ msgstr "" "Sondas GI não são suportadas pelo driver vídeo GLES2.\n" "Em vez disso, use um BakedLightmap." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamerda foi descontinuada e será removida no Godot 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "Uma SpotLight com ângulo superior a 90 graus não cria sombras." @@ -13081,6 +13131,10 @@ msgstr "Variações só podem ser atribuídas na função vértice." msgid "Constants cannot be modified." msgstr "Constantes não podem ser modificadas." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "InterpolatedCamerda foi descontinuada e será removida no Godot 4.0." + #~ msgid "No" #~ msgstr "Não" diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index 1e099e065c..c2e8116938 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -20,7 +20,7 @@ # MalcomRF <malcomkbk@gmail.com>, 2017. # Marcus Correia <marknokalt@live.com>, 2017-2018. # Michael Alexsander Silva Dias <michaelalexsander@protonmail.com>, 2017-2018. -# Renato Rotenberg <renato.rotenberg@gmail.com>, 2017, 2019. +# Renato Rotenberg <renato.rotenberg@gmail.com>, 2017, 2019, 2021. # Rodolfo R Gomes <rodolforg@gmail.com>, 2017-2018, 2019. # Tiago Almeida <thyagoeap@gmail.com>, 2017. # Mauricio Luan Carneiro deSouza <newmailmlcs@gmail.com>, 2018. @@ -110,12 +110,14 @@ # Lucas Dantas <lucas.lucantas38@gmail.com>, 2021. # Carlos Bonifacio <carlosboni.sa@gmail.com>, 2021. # Lucas Castro <castroclucas@gmail.com>, 2021. +# Ricardo Zamarrenho Carvalho Correa <ricardozcc17@gmail.com>, 2021. +# Diego dos Reis Macedo <diego_dragon97@hotmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2021-01-26 03:28+0000\n" -"Last-Translator: Lucas Castro <castroclucas@gmail.com>\n" +"PO-Revision-Date: 2021-03-10 22:14+0000\n" +"Last-Translator: Renato Rotenberg <renato.rotenberg@gmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" "Language: pt_BR\n" @@ -123,7 +125,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 4.5-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -751,7 +753,7 @@ msgstr "Selecionar Trilhas para Copiar" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Copiar" @@ -1957,8 +1959,8 @@ msgid "Open a File or Directory" msgstr "Abrir Arquivo ou Diretório" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Salvar" @@ -2633,7 +2635,8 @@ msgstr "" "falhou." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Não foi possível encontrar o campo de script para o plugin em: 'res://addons/" "%s'." @@ -3068,14 +3071,6 @@ msgid "Help" msgstr "Ajuda" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Pesquisar" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Documentação Online" @@ -3241,6 +3236,24 @@ msgid "Open & Run a Script" msgstr "Abrir e Rodar um Script" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"Os seguintes arquivos são mais recentes no disco.\n" +"Que ação deve ser tomada?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Recarregar" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Salve novamente" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Novo Herdado" @@ -3452,7 +3465,7 @@ msgstr "Tornar Único" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Colar" @@ -4159,6 +4172,21 @@ msgstr "Você retornou um objeto derivado de Nó no método `post_import()`?" msgid "Saving..." msgstr "Salvando..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Modo de Seleção" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importar" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Usar sRGB Padrão" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Arquivos" @@ -5131,7 +5159,8 @@ msgid "Got:" msgstr "Obtido:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Falha na verificação da hash sha256" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5235,7 +5264,6 @@ msgid "Sort:" msgstr "Ordenar:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Categoria:" @@ -7063,6 +7091,14 @@ msgstr "Fechar Docs" msgid "Run" msgstr "Rodar" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Pesquisar" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Passo para dentro" @@ -7116,16 +7152,6 @@ msgstr "" "Os seguintes arquivos são mais recentes no disco.\n" "Que ação deve ser tomada?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Recarregar" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Salve novamente" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Depurador" @@ -7219,8 +7245,8 @@ msgstr "Breakpoints" msgid "Go To" msgstr "Ir Para" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Recortar" @@ -7443,6 +7469,10 @@ msgid "Yaw" msgstr "Guinada" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "Tamanho" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "Objetos Desenhados" @@ -10126,6 +10156,10 @@ msgid "Projects" msgstr "Projetos" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "Carregando, por favor aguarde." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "Ultima Modificação" @@ -10496,6 +10530,11 @@ msgstr "O AutoLoad" msgid "Plugins" msgstr "Plugins" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Carregar Padrão" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Predefinição..." @@ -10745,6 +10784,14 @@ msgid "Instance Child Scene" msgstr "Instânciar Cena Filha" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "Não é possível colar o nó raiz na mesma cena." + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "Colar Nó(s)" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Remover Script" @@ -10871,6 +10918,10 @@ msgid "Attach Script" msgstr "Adicionar Script" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "Recortar Nó(s)" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Remover Nó(s)" @@ -11680,7 +11731,7 @@ msgstr "Atribua um recurso MeshLibrary a este GridMap para usar seus meshes." #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Begin Bake" -msgstr "" +msgstr "Iniciar pré-cálculo" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Preparing data structures" @@ -11695,19 +11746,18 @@ msgid "Direct lighting" msgstr "Direct lightning" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Indirect lighting" -msgstr "Recuar Direita" +msgstr "Iluminação indireta" #: modules/lightmapper_cpu/lightmapper_cpu.cpp #, fuzzy msgid "Post processing" -msgstr "Pós-Processamento" +msgstr "Pós-processamento" #: modules/lightmapper_cpu/lightmapper_cpu.cpp #, fuzzy msgid "Plotting lightmaps" -msgstr "Planejando Luzes:" +msgstr "Traçando mapas de luz" #: modules/mono/csharp_script.cpp msgid "Class name can't be a reserved keyword" @@ -12249,18 +12299,12 @@ msgstr "" "exportação." #: platform/android/export/export.cpp -#, fuzzy msgid "A valid Android SDK path is required in Editor Settings." -msgstr "" -"Caminho do Android SDK inválido para o build personalizado em Configurações " -"do Editor." +msgstr "Um caminho Android SDK é necessário nas Configurações do Editor." #: platform/android/export/export.cpp -#, fuzzy msgid "Invalid Android SDK path in Editor Settings." -msgstr "" -"Caminho do Android SDK inválido para o build personalizado em Configurações " -"do Editor." +msgstr "Caminho do Android SDK está inválido para Configurações do Editor." #: platform/android/export/export.cpp msgid "Missing 'platform-tools' directory!" @@ -12272,16 +12316,14 @@ msgstr "" "Não foi possível encontrar o comando adb nas ferramentas do Android SDK." #: platform/android/export/export.cpp -#, fuzzy msgid "Please check in the Android SDK directory specified in Editor Settings." msgstr "" -"Caminho do Android SDK inválido para o build personalizado em Configurações " +"Por favor, verifique o caminho do Android SDK especificado nas Configurações " "do Editor." #: platform/android/export/export.cpp -#, fuzzy msgid "Missing 'build-tools' directory!" -msgstr "Diretório 'ferramentas-da-plataforma' ausente!" +msgstr "Diretório 'ferramentas-da-plataforma' está faltando !" #: platform/android/export/export.cpp msgid "Unable to find Android SDK build-tools' apksigner command." @@ -12547,6 +12589,18 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Um nó CollisionPolygon2D vazio não é efetivo para colisão." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" +"Polígono inválido. Pelo menos 3 pontos são necessários no modo de construção " +"\"Sólidos\"." + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" +"Polígono inválido. Pelo menos 2 pontos são necessários no modo de construção " +"\"Segmentos\"." + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12760,24 +12814,21 @@ msgid "Finding meshes and lights" msgstr "Encontrando malhas e luzes" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing geometry (%d/%d)" -msgstr "Analisando Geometria..." +msgstr "Preparando geometria (%d/%d)" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing environment" -msgstr "Visualizar Ambiente" +msgstr "Preparando ambiente" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Generating capture" -msgstr "Generando Lightmaps" +msgstr "Gerando captura" #: scene/3d/baked_lightmap.cpp #, fuzzy msgid "Saving lightmaps" -msgstr "Generando Lightmaps" +msgstr "Salvando mapas de luz" #: scene/3d/baked_lightmap.cpp msgid "Done" @@ -12868,11 +12919,6 @@ msgstr "" "GIProbes não são suportados pelo driver de vídeo GLES2.\n" "Use um BakedLightmap em vez disso." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "IntepolatedCamera foi depreciada e será removida no Godot 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "Um SpotLight com um ângulo maior que 90 graus não pode criar sombras." @@ -13123,9 +13169,8 @@ msgid "Must use a valid extension." msgstr "Deve usar uma extensão válida." #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Enable grid minimap." -msgstr "Ativar Snap" +msgstr "Ativar minimapa de grade." #: scene/gui/popup.cpp msgid "" @@ -13217,6 +13262,10 @@ msgstr "Variáveis só podem ser atribuídas na função de vértice." msgid "Constants cannot be modified." msgstr "Constantes não podem serem modificadas." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "IntepolatedCamera foi depreciada e será removida no Godot 4.0." + #~ msgid "No" #~ msgstr "Não" @@ -14876,9 +14925,6 @@ msgstr "Constantes não podem serem modificadas." #~ msgid "Use Default Light" #~ msgstr "Usar Luz Padrão" -#~ msgid "Use Default sRGB" -#~ msgstr "Usar sRGB Padrão" - #~ msgid "Default Light Normal:" #~ msgstr "Luz Normal Padrão:" diff --git a/editor/translations/ro.po b/editor/translations/ro.po index 8cdaef5b59..33f5264d71 100644 --- a/editor/translations/ro.po +++ b/editor/translations/ro.po @@ -661,7 +661,7 @@ msgstr "Selectează Pistele de Copiat" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Copiază" @@ -1874,8 +1874,8 @@ msgid "Open a File or Directory" msgstr "Deschideți un Fişier sau Director" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Salvați" @@ -2548,7 +2548,8 @@ msgstr "" "Nu se poate inițializa plugin-ul la: '%s' analizarea configurației a eșuat." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Nu a putut fi găsit câmpul scriptului pentru plugin la: 'res://addons/%s'." @@ -2985,14 +2986,6 @@ msgid "Help" msgstr "Ajutor" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Căutare" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Documentație Online" @@ -3148,6 +3141,23 @@ msgid "Open & Run a Script" msgstr "Deschide și Execută un Script" #: editor/editor_node.cpp +#, fuzzy +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "Următoarele file au eșuat extragerea din pachet:" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Derivare Nouă" @@ -3350,7 +3360,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4046,6 +4056,21 @@ msgstr "" msgid "Saving..." msgstr "Se Salvează..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Selectare mod" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importare" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Încărcați Implicit" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Fișiere" @@ -5033,7 +5058,8 @@ msgid "Got:" msgstr "Primit:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Verificare hash sha256 eșuată" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5142,7 +5168,6 @@ msgid "Sort:" msgstr "Sorare:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Categorie:" @@ -7031,6 +7056,14 @@ msgstr "" msgid "Run" msgstr "Execută" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Căutare" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7083,16 +7116,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -7193,8 +7216,8 @@ msgstr "Șterge puncte" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7427,6 +7450,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -10065,6 +10092,11 @@ msgid "Projects" msgstr "Proiect" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "Se recuperează oglinzile, te rog așteaptă..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10433,6 +10465,11 @@ msgstr "" msgid "Plugins" msgstr "Plugin-uri" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Încărcați Implicit" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Presetare..." @@ -10682,6 +10719,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Lipește Postura" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Curăță Scriptul" @@ -10811,6 +10857,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Creează Nod" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -12445,6 +12496,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12705,11 +12764,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13254,10 +13308,6 @@ msgstr "" #~ msgstr "Creează un Corp Static Convex" #, fuzzy -#~ msgid "Custom Node" -#~ msgstr "Creează Nod" - -#, fuzzy #~ msgid "Snap (s): " #~ msgstr "Pas (s):" diff --git a/editor/translations/ru.po b/editor/translations/ru.po index 122e75352d..5a443fd1e3 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -91,11 +91,12 @@ # Roman Tolkachyov <roman@tolkachyov.name>, 2020. # Igor Grachev <igorecha.9999@gmail.com>, 2020. # Dmytro Meleshko <dmytro.meleshko@gmail.com>, 2021. +# narrnika <narr13niki@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-01-21 08:48+0000\n" +"PO-Revision-Date: 2021-03-16 10:40+0000\n" "Last-Translator: Danil Alexeev <danil@alexeev.xyz>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" @@ -105,7 +106,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -733,7 +734,7 @@ msgstr "Выбрать треки для копирования" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Копировать" @@ -1938,8 +1939,8 @@ msgid "Open a File or Directory" msgstr "Открыть каталог или файл" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Сохранить" @@ -2614,8 +2615,8 @@ msgstr "" "конфигурации." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "Не удаётся найти поле script для плагина: «res://addons/%s»." +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "Не удаётся найти поле script для плагина: «%s»." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -3045,14 +3046,6 @@ msgid "Help" msgstr "Справка" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Поиск" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Онлайн документация" @@ -3219,6 +3212,24 @@ msgid "Open & Run a Script" msgstr "Открыть и запустить скрипт" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"Следующие файлы изменены на диске.\n" +"Какое действие следует выполнить?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Перезагрузить" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Пересохранить" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Новая унаследованная сцена" @@ -3429,7 +3440,7 @@ msgstr "Сделать уникальным" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Вставить" @@ -3553,7 +3564,7 @@ msgstr "(Текущий)" #: editor/export_template_manager.cpp msgid "Retrieving mirrors, please wait..." -msgstr "Получение зеркал, пожалуйста подождите..." +msgstr "Получение зеркал, пожалуйста, подождите..." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" @@ -4132,6 +4143,18 @@ msgstr "Вы вернули производный от Node объект в м msgid "Saving..." msgstr "Сохранение..." +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "Выберите импортёр" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "Импортёр:" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "Сбросить настройки" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d файлов" @@ -5088,7 +5111,7 @@ msgstr "Время ожидания." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Bad download hash, assuming file has been tampered with." -msgstr "Несовпадение хэша загрузки, возможно файл был изменён." +msgstr "Несовпадение хеша загрузки, возможно файл был изменён." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Expected:" @@ -5099,8 +5122,8 @@ msgid "Got:" msgstr "Получено:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" -msgstr "Не удалось проверить sha256 хэш" +msgid "Failed SHA-256 hash check" +msgstr "Не удалось проверить хеш SHA-256" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5203,7 +5226,6 @@ msgid "Sort:" msgstr "Сортировка:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Категория:" @@ -5727,7 +5749,7 @@ msgstr "Очистить пользовательские кости" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "View" -msgstr "Обзор" +msgstr "Вид" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Always Show Grid" @@ -5767,7 +5789,7 @@ msgstr "Кадрировать выбранное" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Preview Canvas Scale" -msgstr "Просмотреть Canvas Scale" +msgstr "Предпросмотр Canvas Scale" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Translation mask for inserting keys." @@ -7025,6 +7047,14 @@ msgstr "Закрыть документацию" msgid "Run" msgstr "Запустить" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Поиск" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Шаг в" @@ -7078,16 +7108,6 @@ msgstr "" "Следующие файлы новее на диске.\n" "Какие меры должны быть приняты?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Перезагрузить" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Пересохранить" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Отладчик" @@ -7184,8 +7204,8 @@ msgstr "Точки останова" msgid "Go To" msgstr "Перейти к" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Вырезать" @@ -7408,8 +7428,12 @@ msgid "Yaw" msgstr "Рыскание" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "Размер" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" -msgstr "Нарисовано обьектов" +msgstr "Нарисовано объектов" #: editor/plugins/spatial_editor_plugin.cpp msgid "Material Changes" @@ -10091,6 +10115,10 @@ msgid "Projects" msgstr "Проекты" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "Загрузка, пожалуйста, ждите..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "Последнее изменение" @@ -10460,6 +10488,10 @@ msgstr "Автозагрузка" msgid "Plugins" msgstr "Плагины" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "Шаблоны импорта" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Предустановка..." @@ -10711,6 +10743,14 @@ msgid "Instance Child Scene" msgstr "Добавить дочернюю сцену" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "Невозможно вставить корневой узел в ту же сцену." + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "Вставить узел(узлы)" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Открепить скрипт" @@ -10838,6 +10878,10 @@ msgid "Attach Script" msgstr "Прикрепить скрипт" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "Вырезать узел(узлы)" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Удалить узел(узлы)" @@ -12492,6 +12536,16 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Пустой CollisionPolygon2D не влияет на столкновения." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" +"Недопустимый полигон. В режиме «Solids» необходимо по крайней мере 3 точки." + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" +"Недопустимый полигон. В режиме «Segments» необходимо по крайней мере 2 точки." + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12814,11 +12868,6 @@ msgstr "" "GIProbes не поддерживаются видеодрайвером GLES2.\n" "Вместо этого используйте BakedLightmap." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera устарела и будет удалена в Godot 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "SpotLight с углом более 90 градусов не может отбрасывать тени." @@ -13159,6 +13208,10 @@ msgstr "Изменения могут быть назначены только msgid "Constants cannot be modified." msgstr "Константы не могут быть изменены." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "InterpolatedCamera устарела и будет удалена в Godot 4.0." + #~ msgid "No" #~ msgstr "Нет" @@ -14822,9 +14875,6 @@ msgstr "Константы не могут быть изменены." #~ msgid "Use Default Light" #~ msgstr "Использовать стандартный свет" -#~ msgid "Use Default sRGB" -#~ msgstr "Использовать sRGB" - #~ msgid "Default Light Normal:" #~ msgstr "Образец стандартного освещения:" diff --git a/editor/translations/si.po b/editor/translations/si.po index 46e606d935..0c3a01f0e4 100644 --- a/editor/translations/si.po +++ b/editor/translations/si.po @@ -3,12 +3,13 @@ # Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). # This file is distributed under the same license as the Godot source code. # Yohan Sandun <Yohan99ysk@gmail.com>, 2018. +# thushariii <thusharipahalage@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2018-12-13 14:42+0100\n" -"Last-Translator: Yohan Sandun <Yohan99ysk@gmail.com>\n" +"PO-Revision-Date: 2021-02-05 09:20+0000\n" +"Last-Translator: thushariii <thusharipahalage@gmail.com>\n" "Language-Team: Sinhala <https://hosted.weblate.org/projects/godot-engine/" "godot/si/>\n" "Language: si\n" @@ -16,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Poedit 2.2\n" +"X-Generator: Weblate 4.5-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -103,11 +104,11 @@ msgstr "කැඩපත" #: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp msgid "Time:" -msgstr "" +msgstr "කාලය:" #: editor/animation_bezier_editor.cpp msgid "Value:" -msgstr "" +msgstr "වටිනාකම:" #: editor/animation_bezier_editor.cpp msgid "Insert Key Here" @@ -190,7 +191,7 @@ msgstr "සජීවීකරණ පුනරාවර්ථනය" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation Loop" -msgstr "" +msgstr "සජීවිකරණ ලූපය වෙනස් කරන්න" #: editor/animation_track_editor.cpp msgid "Property Track" @@ -249,7 +250,7 @@ msgstr "Anim පසුරු:" #: editor/animation_track_editor.cpp msgid "Change Track Path" -msgstr "" +msgstr "පථය වෙනස් කරන්න" #: editor/animation_track_editor.cpp msgid "Toggle this track on/off." @@ -331,7 +332,7 @@ msgstr "යතුරු මකා දමන්න" #: editor/animation_track_editor.cpp msgid "Change Animation Update Mode" -msgstr "" +msgstr "සජීවිකරණ යාවත්කාලීන ප්රකාරය වෙනස් කරන්න" #: editor/animation_track_editor.cpp #, fuzzy @@ -435,7 +436,7 @@ msgstr "ලුහුබදින්නෙක් එක් කරන්න" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a key." -msgstr "" +msgstr "පථය අවලංගු බැවින් යතුරක් එක් කළ නොහැක." #: editor/animation_track_editor.cpp msgid "Track is not of type Spatial, can't insert key" @@ -646,7 +647,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1817,8 +1818,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -2454,7 +2455,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2844,14 +2845,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3006,6 +2999,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3208,7 +3217,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3891,6 +3900,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4849,7 +4870,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4953,7 +4974,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6733,6 +6753,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6784,16 +6812,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -6887,8 +6905,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7109,6 +7127,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9654,6 +9676,10 @@ msgid "Projects" msgstr "" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10014,6 +10040,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10257,6 +10287,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "යතුරු පිටපත් කරන්න" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10381,6 +10420,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "යතුරු පිටපත් කරන්න" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -11968,6 +12012,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12223,11 +12275,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/sk.po b/editor/translations/sk.po index c9133c8d7c..68da1b1221 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -647,7 +647,7 @@ msgstr "Vybrať Track-y na skopírovanie" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopírovať" @@ -1851,8 +1851,8 @@ msgid "Open a File or Directory" msgstr "Otvoriť súbor / priečinok" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Uložiť" @@ -2519,7 +2519,8 @@ msgstr "" "Addon plugin nie je možné povoliť pri: '% s' analýze konfigurácie zlyhalo." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Nepodarilo sa nájsť script field pre addon plugin v: 'res://addons/%s'." @@ -2950,14 +2951,6 @@ msgid "Help" msgstr "Pomoc" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Vyhľadať" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Online Dokumentácie" @@ -3122,6 +3115,23 @@ msgid "Open & Run a Script" msgstr "Otvoriť a vykonať skript" #: editor/editor_node.cpp +#, fuzzy +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "Nasledovné súbory sa nepodarilo extrahovať z balíka:" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Novo Zdedené" @@ -3331,7 +3341,7 @@ msgstr "Spraviť Jedinečným" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Vložiť" @@ -4030,6 +4040,21 @@ msgstr "Vrátili ste Node-derived objekt v `post_import()` metóde?" msgid "Saving..." msgstr "Ukladám..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Vybrať Režim" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Import" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Načítať predvolené" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Súbory" @@ -4994,7 +5019,8 @@ msgid "Got:" msgstr "Má:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Zlyhalo sha256 hash check" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5098,7 +5124,6 @@ msgid "Sort:" msgstr "Zoradiť:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategória:" @@ -6932,6 +6957,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Vyhľadať" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6984,16 +7017,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -7092,8 +7115,8 @@ msgstr "Všetky vybrané" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7321,6 +7344,11 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Size" +msgstr "Veľkosť: " + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9958,6 +9986,11 @@ msgid "Projects" msgstr "Zakladatelia Projektu" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "Načítavanie zrkadiel, prosím čakajte..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10327,6 +10360,11 @@ msgstr "" msgid "Plugins" msgstr "Pluginy" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Načítať predvolené" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10572,6 +10610,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Vložiť" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Popis:" @@ -10696,6 +10743,11 @@ msgid "Attach Script" msgstr "Popis:" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Vložiť" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -12338,6 +12390,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Prázdny CollisionPolygon2D nemá žiaden efekt na kolíziu." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12609,11 +12669,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13040,10 +13095,6 @@ msgstr "" #~ msgstr "Vytvoriť adresár" #, fuzzy -#~ msgid "Custom Node" -#~ msgstr "Vložiť" - -#, fuzzy #~ msgid "Create Area" #~ msgstr "Vytvoriť adresár" diff --git a/editor/translations/sl.po b/editor/translations/sl.po index a953258d3f..69819f0a36 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -12,12 +12,13 @@ # Arnold Marko <arnold.marko@gmail.com>, 2019. # Alex <alexrixhardson@gmail.com>, 2019. # Andrew Poženel <andrej.pozenel@outlook.com>, 2020. +# Jakob Tadej Vrtačnik <minecraftalka2@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-07-15 02:42+0000\n" -"Last-Translator: Andrew Poženel <andrej.pozenel@outlook.com>\n" +"PO-Revision-Date: 2021-02-01 20:54+0000\n" +"Last-Translator: Jakob Tadej Vrtačnik <minecraftalka2@gmail.com>\n" "Language-Team: Slovenian <https://hosted.weblate.org/projects/godot-engine/" "godot/sl/>\n" "Language: sl\n" @@ -26,7 +27,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" "%100==4 ? 2 : 3;\n" -"X-Generator: Weblate 4.2-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -370,7 +371,7 @@ msgstr "Odstrani animacijsko sled" #: editor/animation_track_editor.cpp msgid "Create NEW track for %s and insert key?" -msgstr "Ustvarim NOVO sled za %s in vstavim ključ?" +msgstr "Ustvarim NOVO sled za %s in vstavi ključ?" #: editor/animation_track_editor.cpp msgid "Create %d NEW tracks and insert keys?" @@ -680,7 +681,7 @@ msgstr "Izberi Lastnost" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1935,8 +1936,8 @@ msgid "Open a File or Directory" msgstr "Odpri Datoteko ali Mapo" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Shrani" @@ -2633,7 +2634,8 @@ msgstr "" "konfiguracije ni uspelo." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Ni mogoče najti polja skripte za dodatni vtičnik na: 'res://addons/%s'." @@ -3085,14 +3087,6 @@ msgid "Help" msgstr "Pomoč" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Iskanje" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Spletna Dokumentacija" @@ -3255,6 +3249,22 @@ msgid "Open & Run a Script" msgstr "Odpri & Zaženi Skripto" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Novo Podedovano" @@ -3463,7 +3473,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -4199,6 +4209,21 @@ msgstr "" msgid "Saving..." msgstr "Shranjevanje..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Izberi Način" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Uvozi" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Naložite Prevzeto" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -5224,7 +5249,8 @@ msgid "Got:" msgstr "Dobil:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Neuspešno preverjanje preizkusa sha256" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5338,7 +5364,6 @@ msgid "Sort:" msgstr "Razvrsti:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategorija:" @@ -7227,6 +7252,14 @@ msgstr "" msgid "Run" msgstr "Zaženi" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Iskanje" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7280,16 +7313,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Razhroščevalnik" @@ -7390,8 +7413,8 @@ msgstr "Izbriši točke" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7626,6 +7649,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -10301,6 +10328,11 @@ msgid "Projects" msgstr "Projekt" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "Pridobivanje virov, počakajte..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10669,6 +10701,11 @@ msgstr "" msgid "Plugins" msgstr "Vtičniki" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Naložite Prevzeto" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Prednastavitev..." @@ -10924,6 +10961,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Prilepi Pozicijo" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Odstrani Gradnik VizualnaSkripta" @@ -11054,6 +11100,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Gradnik Prehod" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -12735,6 +12786,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Prazen CollisionPolygon2D nima vpliva na collision." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -13001,11 +13060,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13564,10 +13618,6 @@ msgstr "Konstante ni možno spreminjati." #~ msgid "Create folder" #~ msgstr "Ustvarite mapo" -#, fuzzy -#~ msgid "Custom Node" -#~ msgstr "Gradnik Prehod" - #~ msgid "Invalid Path" #~ msgstr "Neveljavna Pot" diff --git a/editor/translations/sq.po b/editor/translations/sq.po index 7dcc32735d..f53d0b630a 100644 --- a/editor/translations/sq.po +++ b/editor/translations/sq.po @@ -632,7 +632,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1887,8 +1887,8 @@ msgid "Open a File or Directory" msgstr "Hap një Skedar ose Direktori" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Ruaj" @@ -2577,7 +2577,8 @@ msgstr "" "dështoi." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "I paaftë te gjej fushën e shkrimit për shtojcën në: 'res://addons/%s'." #: editor/editor_node.cpp @@ -3023,14 +3024,6 @@ msgid "Help" msgstr "Ndihmë" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Kërko" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Dokumentimi Online" @@ -3191,6 +3184,22 @@ msgid "Open & Run a Script" msgstr "Hap & Fillo një Shkrim" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "E Trashëguar e Re" @@ -3404,7 +3413,7 @@ msgstr "Bëje Unik" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Ngjit" @@ -4123,6 +4132,21 @@ msgstr "" msgid "Saving..." msgstr "Duke Ruajtur..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Zgjidh Nyjet Për ti Importuar" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importo" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Ngarko të Parazgjedhur" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -5088,7 +5112,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5196,7 +5220,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6996,6 +7019,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Kërko" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7047,16 +7078,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -7153,8 +7174,8 @@ msgstr "Krijo pika." msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7380,6 +7401,11 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Size" +msgstr "Madhësia: " + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9958,6 +9984,11 @@ msgid "Projects" msgstr "Projekti" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "Duke marrë pasqyrat, ju lutem prisni..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10320,6 +10351,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Ngarko të Parazgjedhur" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10567,6 +10603,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Dyfisho Nyjet" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Shkrim i Ri" @@ -10692,6 +10737,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Dyfisho Nyjet" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -12319,6 +12369,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12576,11 +12634,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po index b07bc4e1c9..4fe901f414 100644 --- a/editor/translations/sr_Cyrl.po +++ b/editor/translations/sr_Cyrl.po @@ -720,7 +720,7 @@ msgstr "Постави прелаз на:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Копирај" @@ -2030,8 +2030,8 @@ msgid "Open a File or Directory" msgstr "Отвори датотеку или директоријум" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Сачувај" @@ -2752,7 +2752,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "Неуспех при прикључивању додатка због конфигурационе датотеке: '%s'." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "Неуспех при налажењу поља за скриптицу у додатку „res://addons/%s“." #: editor/editor_node.cpp @@ -3213,14 +3214,6 @@ msgid "Help" msgstr "Помоћ" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Тражи" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Онлајн документација" @@ -3400,6 +3393,25 @@ msgid "Open & Run a Script" msgstr "Отвори и покрени скриптицу" #: editor/editor_node.cpp +#, fuzzy +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"Следеће датотеке су нове на диску.\n" +"Која акција се треба предузети?:" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Освежи" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Поново сачувај" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Нова наслеђена" @@ -3631,7 +3643,7 @@ msgstr "Учини Јединственим" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Налепи" @@ -4403,6 +4415,21 @@ msgstr "" msgid "Saving..." msgstr "Чување..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Одабери режим" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Увоз" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Учитај уобичајено" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -5480,7 +5507,8 @@ msgid "Got:" msgstr "Добијено:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "Неуспела провера sha256 суме" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5599,7 +5627,6 @@ msgid "Sort:" msgstr "Сортирање:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Категорија:" @@ -7619,6 +7646,14 @@ msgstr "Затвори документацију" msgid "Run" msgstr "Покрени" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Тражи" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Корак у" @@ -7674,16 +7709,6 @@ msgstr "" "Следеће датотеке су нове на диску.\n" "Која акција се треба предузети?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Освежи" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Поново сачувај" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Дебагер" @@ -7791,8 +7816,8 @@ msgstr "Тачке прекида" msgid "Go To" msgstr "Иди На" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Исеци" @@ -8041,6 +8066,11 @@ msgid "Yaw" msgstr "Горе-Доле" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Size" +msgstr "Величина:" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "Нацртани објекти" @@ -11142,6 +11172,11 @@ msgstr "Пројекти" #: editor/project_manager.cpp #, fuzzy +msgid "Loading, please wait..." +msgstr "Прихватам одредишта, молим сачекајте..." + +#: editor/project_manager.cpp +#, fuzzy msgid "Last Modified" msgstr "Задњи Измењен" @@ -11596,6 +11631,11 @@ msgstr "Ауто-Учитавање" msgid "Plugins" msgstr "Прикључци" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Учитај уобичајено" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Поставке..." @@ -11902,6 +11942,16 @@ msgstr "Инстанца Сцена Дете" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Немогуће оперисати на чвору из стране сцене!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Налепи Чворове" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Detach Script" msgstr "Припој Скрипту" @@ -12057,6 +12107,11 @@ msgstr "Припој Скрипту" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Cut Node(s)" +msgstr "Направи чвор" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Remove Node(s)" msgstr "Уклони Чвор/ове" @@ -13977,6 +14032,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Непријатењ СударниМногоугао2Д нема утицаја на судар." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp #, fuzzy msgid "" @@ -14331,11 +14394,6 @@ msgstr "" " \n" "Као замену користи ИспеченеСенкеМапу." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp #, fuzzy msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." @@ -15087,10 +15145,6 @@ msgstr "Константе није могуће мењати." #~ msgstr "CheckBox Radio2" #, fuzzy -#~ msgid "Custom Node" -#~ msgstr "Направи чвор" - -#, fuzzy #~ msgid "Snap (s): " #~ msgstr "Један корак (сек.):" diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po index 232c53da80..3d979c3fc6 100644 --- a/editor/translations/sr_Latn.po +++ b/editor/translations/sr_Latn.po @@ -654,7 +654,7 @@ msgstr "Postavi tranzicije na:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1827,8 +1827,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -2468,7 +2468,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2860,14 +2860,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3022,6 +3014,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3225,7 +3233,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3908,6 +3916,19 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Uduplaj Selekciju" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4873,7 +4894,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4977,7 +4998,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6771,6 +6791,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6822,16 +6850,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -6926,8 +6944,8 @@ msgstr "Napravi" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7153,6 +7171,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9733,6 +9755,10 @@ msgid "Projects" msgstr "" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10096,6 +10122,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10340,6 +10370,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Animacija Uduplaj Ključeve" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10464,6 +10503,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Animacija Uduplaj Ključeve" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -12060,6 +12104,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12315,11 +12367,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/sv.po b/editor/translations/sv.po index cab4b7e5bc..a7bc3d6288 100644 --- a/editor/translations/sv.po +++ b/editor/translations/sv.po @@ -662,7 +662,7 @@ msgstr "Välj Spår att Kopiera" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopiera" @@ -1899,8 +1899,8 @@ msgid "Open a File or Directory" msgstr "Öppna en Fil eller Katalog" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Spara" @@ -2598,7 +2598,8 @@ msgstr "" "Kunde inte aktivera addon plugin vid: '%s' parsning av config misslyckades." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "Kan inte hitta skriptfältet för addon plugin vid: 'res://addons/%s'." #: editor/editor_node.cpp @@ -3026,14 +3027,6 @@ msgid "Help" msgstr "Hjälp" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Sök" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Dokumentation Online" @@ -3193,6 +3186,23 @@ msgid "Open & Run a Script" msgstr "Öppna & Kör ett Skript" #: editor/editor_node.cpp +#, fuzzy +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "Följande filer gick inte att packa upp från tillägget:" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Ladda om" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Spara om" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3405,7 +3415,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Klistra in" @@ -4142,6 +4152,21 @@ msgstr "" msgid "Saving..." msgstr "Sparar..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Välj Node" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importera" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Ladda Standard" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Filer" @@ -5152,7 +5177,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5256,7 +5281,6 @@ msgid "Sort:" msgstr "Sortera:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategori:" @@ -7114,6 +7138,14 @@ msgstr "" msgid "Run" msgstr "Kör" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Sök" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7166,16 +7198,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Ladda om" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Spara om" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -7276,8 +7298,8 @@ msgstr "Radera punkter" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Klipp" @@ -7515,6 +7537,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -10192,6 +10218,11 @@ msgid "Projects" msgstr "Projekt" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "Laddar..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "Senast Ändrad" @@ -10559,6 +10590,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Ladda Standard" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10816,6 +10852,15 @@ msgid "Instance Child Scene" msgstr "Instansiera Barn-Scen" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Klistra in Noder" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "Fäst Skript" @@ -10946,6 +10991,11 @@ msgid "Attach Script" msgstr "Fäst Skript" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Klipp ut Noder" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Ta bort Nod(er)" @@ -12615,6 +12665,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "En tom CollisionPolygon2D har ingen effekt på kollision." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12893,11 +12951,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/ta.po b/editor/translations/ta.po index 45de03bdb3..9f9f40b54b 100644 --- a/editor/translations/ta.po +++ b/editor/translations/ta.po @@ -650,7 +650,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1823,8 +1823,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -2459,7 +2459,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2851,14 +2851,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3012,6 +3004,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3215,7 +3223,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3899,6 +3907,19 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "அனைத்து தேர்வுகள்" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4858,7 +4879,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4962,7 +4983,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6738,6 +6758,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6789,16 +6817,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -6891,8 +6909,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7114,6 +7132,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9654,6 +9676,10 @@ msgid "Projects" msgstr "" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10015,6 +10041,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10259,6 +10289,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "அசைவூட்டு போலிபச்சாவிகள்" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10383,6 +10422,11 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "அசைவூட்டு போலிபச்சாவிகள்" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -11968,6 +12012,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12223,11 +12275,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/te.po b/editor/translations/te.po index aa703812fe..50c0fb5a4b 100644 --- a/editor/translations/te.po +++ b/editor/translations/te.po @@ -628,7 +628,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1797,8 +1797,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -2432,7 +2432,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2822,14 +2822,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -2983,6 +2975,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3185,7 +3193,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3866,6 +3874,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4813,7 +4833,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4917,7 +4937,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6684,6 +6703,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6735,16 +6762,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -6837,8 +6854,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7059,6 +7076,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9580,6 +9601,10 @@ msgid "Projects" msgstr "" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -9940,6 +9965,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10183,6 +10212,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10303,6 +10340,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -11877,6 +11918,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12132,11 +12181,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/th.po b/editor/translations/th.po index 4b1d938c54..76a2d3c125 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -7,13 +7,13 @@ # Thanachart Monpassorn <nunf_2539@hotmail.com>, 2020. # Anonymous <noreply@weblate.org>, 2020. # Lon3r <mptube.p@gmail.com>, 2020. -# Kongfa Warorot <gongpha@hotmail.com>, 2020. +# Kongfa Warorot <gongpha@hotmail.com>, 2020, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-12-31 07:09+0000\n" -"Last-Translator: Thanachart Monpassorn <nunf_2539@hotmail.com>\n" +"PO-Revision-Date: 2021-02-15 10:51+0000\n" +"Last-Translator: Kongfa Warorot <gongpha@hotmail.com>\n" "Language-Team: Thai <https://hosted.weblate.org/projects/godot-engine/godot/" "th/>\n" "Language: th\n" @@ -21,7 +21,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.4.1-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -643,7 +643,7 @@ msgstr "เลือกแทร็กที่จะคัดลอก" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "คัดลอก" @@ -1836,8 +1836,8 @@ msgid "Open a File or Directory" msgstr "เปิดไฟล์หรือโฟลเดอร์" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "บันทึก" @@ -2347,7 +2347,7 @@ msgstr "ยังไม่ได้เลือกฉากที่จะเล #: editor/editor_node.cpp msgid "Save scene before running..." -msgstr "" +msgstr "บันทึกฉากก่อนที่จะทำงาน..." #: editor/editor_node.cpp msgid "Could not start subprocess!" @@ -2489,7 +2489,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "ไม่สามารถเปิดใช้งานปลั๊กอิน: '%s'" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "ไม่พบชื่อสคริปต์ในปลั๊กอิน: 'res://addons/%s'" #: editor/editor_node.cpp @@ -2907,14 +2908,6 @@ msgid "Help" msgstr "ช่วยเหลือ" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "ค้นหา" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "คู่มือ" @@ -3076,6 +3069,25 @@ msgid "Open & Run a Script" msgstr "เปิดและรันสคริปต์" #: editor/editor_node.cpp +#, fuzzy +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"ไฟล์ต่อไปนี้ในดิสก์ใหม่กว่า\n" +"จะทำอย่างไรต่อไป?:" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "โหลดใหม่" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "บันทึกอีกครั้ง" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "สืบทอด" @@ -3282,7 +3294,7 @@ msgstr "ไม่ใช้ร่วมกับวัตถุอื่น" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "วาง" @@ -3975,6 +3987,21 @@ msgstr "คุณส่งคืนออบเจกต์โหนดย่อ msgid "Saving..." msgstr "กำลังบันทึก..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "โหมดเลือก" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "นำเข้า" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "โหลดค่าเริ่มต้น" + #: editor/import_dock.cpp msgid "%d Files" msgstr "ไฟล์ %d" @@ -4930,7 +4957,8 @@ msgid "Got:" msgstr "ที่ได้รับ:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +#, fuzzy +msgid "Failed SHA-256 hash check" msgstr "ผิดพลาดในการตรวจสอบแฮช SHA256" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5034,7 +5062,6 @@ msgid "Sort:" msgstr "เรียงตาม:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "หมวดหมู่:" @@ -6834,6 +6861,14 @@ msgstr "ปิดคู่มือ" msgid "Run" msgstr "เริ่ม" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "ค้นหา" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "คำสั่งต่อไป" @@ -6887,16 +6922,6 @@ msgstr "" "ไฟล์ต่อไปนี้ในดิสก์ใหม่กว่า\n" "จะทำอย่างไรต่อไป?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "โหลดใหม่" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "บันทึกอีกครั้ง" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "ตัวดีบัก" @@ -6989,8 +7014,8 @@ msgstr "เบรกพอยต์" msgid "Go To" msgstr "ไปยัง" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "ตัด" @@ -7213,6 +7238,11 @@ msgid "Yaw" msgstr "Yaw" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Size" +msgstr "ขนาด: " + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "ออบเจกต์ที่วาด" @@ -9846,6 +9876,11 @@ msgid "Projects" msgstr "โปรเจกต์" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "กำลังเรียกข้อมูล โปรดรอ..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "แก้ไขล่าสุด" @@ -10210,6 +10245,11 @@ msgstr "ออโต้โหลด" msgid "Plugins" msgstr "ปลั๊กอิน" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "โหลดค่าเริ่มต้น" + #: editor/property_editor.cpp msgid "Preset..." msgstr "พรีเซ็ต..." @@ -10457,6 +10497,16 @@ msgid "Instance Child Scene" msgstr "อินสแตนซ์ฉากลูก" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "ทำกับโหนดของฉากอื่นไม่ได้!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "วางโหนด" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "ค้นพบสคริปต์" @@ -10582,6 +10632,11 @@ msgid "Attach Script" msgstr "แนบสคริปต์" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "ตัดโหนด" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "ลบโหนด" @@ -12204,6 +12259,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "CollisionPolygon2D ที่ว่างเปล่าจะไม่มีผลทางกายภาพ" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12493,11 +12556,6 @@ msgstr "" "ไดรเวอร์วีดีโอ GLES2 ไม่สนับสนุน GIProbe\n" "ใช้ BakedLightmap แทน" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera เลิกใช้งานแล้วและจะถูกลบออกใน Godot 4.0" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "SpotLight ที่มีมุมมากกว่า 90 ไม่สามารถสร้างเงา" @@ -12818,6 +12876,10 @@ msgstr "Varyings สามารถกำหนดในังก์ชันเ msgid "Constants cannot be modified." msgstr "ค่าคงที่ไม่สามารถแก้ไขได้" +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "InterpolatedCamera เลิกใช้งานแล้วและจะถูกลบออกใน Godot 4.0" + #~ msgid "No" #~ msgstr "ไม่" diff --git a/editor/translations/tr.po b/editor/translations/tr.po index 867a66b3dc..9a815d3f25 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -46,22 +46,23 @@ # Kaan Genç <kaan@kaangenc.me>, 2020. # Anonymous <noreply@weblate.org>, 2020. # Güneş Gümüş <gunes.gumus.001@gmail.com>, 2020. -# Oğuz Ersen <oguzersen@protonmail.com>, 2020. +# Oğuz Ersen <oguzersen@protonmail.com>, 2020, 2021. # Vedat Günel <gunel15@itu.edu.tr>, 2020. # Ahmet Elgün <ahmetelgn@gmail.com>, 2020. # Efruz Yıldırır <efruzyildirir@gmail.com>, 2020. # Hazar <duurkak@yandex.com>, 2020. # Mutlu ORAN <mutlu.oran66@gmail.com>, 2020. # Yusuf Osman YILMAZ <wolfkan4219@gmail.com>, 2020. -# furkan atalar <fatalar55@gmail.com>, 2020. +# furkan atalar <fatalar55@gmail.com>, 2020, 2021. # Suleyman Poyraz <zaryob.dev@gmail.com>, 2020. # Çağlar KOPARIR <ckoparir@gmail.com>, 2021. +# Cem Eren Fukara <cefukara@hotmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-01-22 10:21+0000\n" -"Last-Translator: Çağlar KOPARIR <ckoparir@gmail.com>\n" +"PO-Revision-Date: 2021-03-16 10:40+0000\n" +"Last-Translator: furkan atalar <fatalar55@gmail.com>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/" "godot/tr/>\n" "Language: tr\n" @@ -69,7 +70,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 4.5-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -698,7 +699,7 @@ msgstr "Kopyalanacak izleri seç" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Kopyala" @@ -1720,7 +1721,7 @@ msgstr "Dock Nod" #: editor/editor_feature_profile.cpp msgid "FileSystem Dock" -msgstr "Dosya sistemi" +msgstr "Dosya Sistemi" #: editor/editor_feature_profile.cpp msgid "Import Dock" @@ -1903,8 +1904,8 @@ msgid "Open a File or Directory" msgstr "Bir Dosya ya da Dizin Aç" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Kaydet" @@ -2038,7 +2039,7 @@ msgstr "Çevrimiçi Rehberler" #: editor/editor_help.cpp msgid "Properties" -msgstr "Özellikler" +msgstr "Özellikleri" #: editor/editor_help.cpp msgid "override:" @@ -2050,7 +2051,7 @@ msgstr "varsayılan:" #: editor/editor_help.cpp msgid "Methods" -msgstr "Yöntemler" +msgstr "Metotlar" #: editor/editor_help.cpp msgid "Theme Properties" @@ -2578,7 +2579,8 @@ msgstr "" "başarısız oldu." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "Eklentideki betik alanı bulunamıyor: 'res://addons/%s'." #: editor/editor_node.cpp @@ -3009,14 +3011,6 @@ msgid "Help" msgstr "Yardım" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Ara" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Çevrimiçi Belgeler" @@ -3182,6 +3176,24 @@ msgid "Open & Run a Script" msgstr "Aç & Bir Betik Çalıştır" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"Aşağıdaki dosyalar diskte daha yeni.\n" +"Hangi eylem yapılsın?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Yeniden Yükle" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Yeniden Kaydet" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Yeni Örnekleme" @@ -3393,7 +3405,7 @@ msgstr "Benzersiz Yap" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Yapıştır" @@ -3953,15 +3965,15 @@ msgstr "Aranıyor..." #: editor/find_in_files.cpp msgid "%d match in %d file." -msgstr "%d dosyada %d eşleşme." +msgstr "%d eşleşme %d dosyada." #: editor/find_in_files.cpp msgid "%d matches in %d file." -msgstr "%d dosyada %d eşleşme." +msgstr "%d eşleşme %d dosyada." #: editor/find_in_files.cpp msgid "%d matches in %d files." -msgstr "%d dosyada %d eşleşme." +msgstr "%d eşleşme %d dosyada." #: editor/groups_editor.cpp msgid "Add to Group" @@ -4099,6 +4111,18 @@ msgstr "`Post_import ()` yönteminde Node türevi bir nesne döndürdünüz mü? msgid "Saving..." msgstr "Kaydediliyor..." +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "İçe Aktarıcı'yı seçin" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "İçe Aktar" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "Varsayılanlara dön" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Dosya" @@ -5066,8 +5090,8 @@ msgid "Got:" msgstr "Alınan:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" -msgstr "Başarısız sha256 hash sınaması" +msgid "Failed SHA-256 hash check" +msgstr "SHA-256 hash kontrolü başarısız oldu" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5170,7 +5194,6 @@ msgid "Sort:" msgstr "Sırala:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategori:" @@ -6990,6 +7013,14 @@ msgstr "Belgeleri Kapat" msgid "Run" msgstr "Çalıştır" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Ara" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "İçeri Adımla" @@ -7043,16 +7074,6 @@ msgstr "" "Aşağıdaki dosyalar diskte daha yeni.\n" "Hangi eylem yapılsın?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Yeniden Yükle" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Yeniden Kaydet" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Hata Ayıklayıcı" @@ -7147,8 +7168,8 @@ msgstr "Hata ayıklama noktaları" msgid "Go To" msgstr "Şuna Git" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Kes" @@ -7371,6 +7392,10 @@ msgid "Yaw" msgstr "Yalpala" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "Boyut" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "Çizilmiş Nesneler" @@ -10051,6 +10076,10 @@ msgid "Projects" msgstr "Projeler" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "Yükleniyor, lütfen bekleyin..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "Son Değişiklik" @@ -10420,6 +10449,11 @@ msgstr "Otomatik Yükle" msgid "Plugins" msgstr "Eklentiler" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Varsayılanları İçe Aktar" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Ön ayar..." @@ -10669,6 +10703,14 @@ msgid "Instance Child Scene" msgstr "Çocuk Sahnesini Örnekle" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "Kök düğüm aynı sahneye yapıştırılamıyor." + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "Düğümleri Yapıştır" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Betiği Ayır" @@ -10796,6 +10838,10 @@ msgid "Attach Script" msgstr "Betik İliştir" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "Düğümleri Kes(s)" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Düğümleri Kaldır" @@ -12446,6 +12492,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Boş bir CollisionPolygon2D'nin çarpışmaya hiçbir etkisi yoktur." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12765,13 +12819,6 @@ msgstr "" "GIProbes GLES2 video sürücüsü tarafından desteklenmez.\n" "Bunun yerine bir BakedLightmap kullanın." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" -"InterpolatedCamera kullanımdan kaldırılmıştır ve Godot 4.0'da " -"kaldırılacaktır." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "90 dereceden geniş açılı SpotIşık gölge oluşturamaz." @@ -13024,7 +13071,7 @@ msgstr "Geçerli bir uzantı kullanılmalı." #: scene/gui/graph_edit.cpp msgid "Enable grid minimap." -msgstr "Izgara mini haritasını etkinleştir." +msgstr "Izgara haritasını etkinleştir." #: scene/gui/popup.cpp msgid "" @@ -13115,6 +13162,12 @@ msgstr "varyings yalnızca vertex işlevinde atanabilir." msgid "Constants cannot be modified." msgstr "Sabit değerler değiştirilemez." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "" +#~ "InterpolatedCamera kullanımdan kaldırılmıştır ve Godot 4.0'da " +#~ "kaldırılacaktır." + #~ msgid "No" #~ msgstr "Hayır" @@ -14748,9 +14801,6 @@ msgstr "Sabit değerler değiştirilemez." #~ msgid "Use Default Light" #~ msgstr "Önyüklü Işık Kullan" -#~ msgid "Use Default sRGB" -#~ msgstr "Önyüklü sRGB'yi Kullan" - #~ msgid "Default Light Normal:" #~ msgstr "Önyüklü Işığın Olağanı:" diff --git a/editor/translations/tzm.po b/editor/translations/tzm.po index 7853cd3b8c..c4614c7eb3 100644 --- a/editor/translations/tzm.po +++ b/editor/translations/tzm.po @@ -626,7 +626,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1795,8 +1795,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -2430,7 +2430,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2820,14 +2820,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -2981,6 +2973,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "" @@ -3183,7 +3191,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3864,6 +3872,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4811,7 +4831,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -4915,7 +4935,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6682,6 +6701,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6733,16 +6760,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -6835,8 +6852,8 @@ msgstr "" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7057,6 +7074,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9577,6 +9598,10 @@ msgid "Projects" msgstr "" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -9937,6 +9962,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10180,6 +10209,14 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "" @@ -10300,6 +10337,10 @@ msgid "Attach Script" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -11874,6 +11915,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12129,11 +12178,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/uk.po b/editor/translations/uk.po index 75da46cdc4..6a8af58119 100644 --- a/editor/translations/uk.po +++ b/editor/translations/uk.po @@ -12,7 +12,7 @@ # Kirill Omelchenko <kirill.omelchenko@gmail.com>, 2018. # Александр <ol-vin@mail.ru>, 2018. # Богдан Матвіїв <bomtvv@gmail.com>, 2019. -# Tymofij Lytvynenko <till.svit@gmail.com>, 2020. +# Tymofij Lytvynenko <till.svit@gmail.com>, 2020, 2021. # Vladislav Glinsky <cl0ne@mithril.org.ua>, 2020. # Микола Тимошенко <9081@ukr.net>, 2020. # Miroslav <zinmirx@gmail.com>, 2020. @@ -20,8 +20,8 @@ msgid "" msgstr "" "Project-Id-Version: Ukrainian (Godot Engine)\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-01-16 01:29+0000\n" -"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n" +"PO-Revision-Date: 2021-03-10 22:14+0000\n" +"Last-Translator: Tymofij Lytvynenko <till.svit@gmail.com>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/" "godot/uk/>\n" "Language: uk\n" @@ -30,7 +30,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -666,7 +666,7 @@ msgstr "Виберіть доріжки для копіювання" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Копіювати" @@ -1152,7 +1152,7 @@ msgstr "Ведучий розробник" #. you do not have to keep it in your translation. #: editor/editor_about.cpp msgid "Project Manager " -msgstr "Керівник проектів " +msgstr "Керівник проєктів " #: editor/editor_about.cpp msgid "Developers" @@ -1873,8 +1873,8 @@ msgid "Open a File or Directory" msgstr "Відкрити файл або каталог" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Зберегти" @@ -2548,9 +2548,8 @@ msgstr "" "налаштування." #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "" -"Не вдалося знайти поле скрипт для доповнення плагіну в: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "Не вдалося знайти поле скрипту для додатка тут: «%s»." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2984,14 +2983,6 @@ msgid "Help" msgstr "Довідка" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Пошук" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Онлайн документація" @@ -3157,6 +3148,24 @@ msgid "Open & Run a Script" msgstr "Відкрити і запустити скрипт" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"На диску зберігаються новіші версії вказаних нижче файлів.\n" +"Що слід зробити?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Перезавантажити" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Перезаписати" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Новий успадкований" @@ -3368,7 +3377,7 @@ msgstr "Зробити унікальним" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Вставити" @@ -4073,6 +4082,18 @@ msgstr "Повернули об'єкт, що походить від Node, у м msgid "Saving..." msgstr "Збереження..." +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "Виберіть засіб імпортування" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "Засіб імпортування:" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "Відновити типові параметри" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d файлів" @@ -5045,8 +5066,8 @@ msgid "Got:" msgstr "Отримав:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" -msgstr "Помилка перевірки хешування sha256" +msgid "Failed SHA-256 hash check" +msgstr "Не вдалося пройти перевірку хешу SHA-256" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5149,7 +5170,6 @@ msgid "Sort:" msgstr "Сортувати:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Категорія:" @@ -6977,6 +6997,14 @@ msgstr "Закрити документацію" msgid "Run" msgstr "Запустити" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Пошук" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "Крок в" @@ -7030,16 +7058,6 @@ msgstr "" "Такі файли на диску новіші.\n" "Що робити?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "Перезавантажити" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "Перезаписати" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "Зневаджувач" @@ -7136,8 +7154,8 @@ msgstr "Точки зупину" msgid "Go To" msgstr "Перейти" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Вирізати" @@ -7360,6 +7378,10 @@ msgid "Yaw" msgstr "Відхилення" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "Розмір" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "Намальовано об'єктів" @@ -10044,13 +10066,17 @@ msgstr "" #. TRANSLATORS: This refers to the application where users manage their Godot projects. #: editor/project_manager.cpp msgid "Project Manager" -msgstr "Керівник проекту" +msgstr "Керівник проєкту" #: editor/project_manager.cpp msgid "Projects" msgstr "Проєкти" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "Завантаження. Будь ласка, зачекайте..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "Востаннє змінено" @@ -10420,6 +10446,10 @@ msgstr "Автозавантаження" msgid "Plugins" msgstr "Плаґіни (додатки)" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "Типові параметри імпортування" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Заздалегідь установлений..." @@ -10671,6 +10701,14 @@ msgid "Instance Child Scene" msgstr "Створити екземпляр дочірньої сцени" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "Не можна вставляти кореневий вузол до сцени цього кореневого вузла." + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "Вставити вузли" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "Від'єднати скрипт" @@ -10797,6 +10835,10 @@ msgid "Attach Script" msgstr "Долучити скрипт" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "Вирізати вузли" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Вилучити вузли" @@ -12475,6 +12517,16 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Порожній CollisionPolygon2D ніяк не вплине на зіткнення." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" +"Некоректний полігон. У режимі збирання «Solids» потрібно принаймні 3 точки." + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" +"Некоректний полігон. У режимі збирання «Segments» потрібні принаймні 2 точки." + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12796,12 +12848,6 @@ msgstr "" "У драйвері GLES2 не передбачено підтримки GIProbes.\n" "Скористайтеся замість них BakedLightmap." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" -"InterpolatedCamera вважається застарілою, її буде вилучено у Godot 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "SpotLight з кутом, який є більшим за 90 градусів, не може давати тіні." @@ -13147,6 +13193,11 @@ msgstr "Змінні величини можна пов'язувати лише msgid "Constants cannot be modified." msgstr "Сталі не можна змінювати." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "" +#~ "InterpolatedCamera вважається застарілою, її буде вилучено у Godot 4.0." + #~ msgid "No" #~ msgstr "Ні" diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index c7722c84c4..a2e1decab6 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -636,7 +636,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "" @@ -1829,8 +1829,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -2480,7 +2480,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2874,14 +2874,6 @@ msgid "Help" msgstr "" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "" @@ -3037,6 +3029,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp #, fuzzy msgid "New Inherited" msgstr "سب سکریپشن بنائیں" @@ -3244,7 +3252,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "" @@ -3942,6 +3950,20 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr ".تمام کا انتخاب" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr ".سپورٹ" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -4913,7 +4935,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5018,7 +5040,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -6835,6 +6856,14 @@ msgstr "" msgid "Run" msgstr "" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -6886,16 +6915,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -6992,8 +7011,8 @@ msgstr ".تمام کا انتخاب" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "" @@ -7218,6 +7237,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -9822,6 +9845,10 @@ msgid "Projects" msgstr ".تمام کا انتخاب" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "" + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10187,6 +10214,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10430,6 +10461,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "ایکشن منتقل کریں" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "سب سکریپشن بنائیں" @@ -10557,6 +10597,11 @@ msgid "Attach Script" msgstr "سب سکریپشن بنائیں" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "ایکشن منتقل کریں" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -12179,6 +12224,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12434,11 +12487,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/vi.po b/editor/translations/vi.po index 97c2be742e..94692dc9b2 100644 --- a/editor/translations/vi.po +++ b/editor/translations/vi.po @@ -15,13 +15,15 @@ # Steve Dang <bynguu@outlook.com>, 2020. # Harry Mitchell <minhyh0987@gmail.com>, 2020. # HSGamer <huynhqtienvtag@gmail.com>, 2020. -# LetterC67 <hoangdeptoong@gmail.com>, 2020. +# LetterC67 <hoangdeptoong@gmail.com>, 2020, 2021. +# Rev <revolnoom7801@gmail.com>, 2021. +# SyliawDeV <thanhlongstranger@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-08-11 14:04+0000\n" -"Last-Translator: LetterC67 <hoangdeptoong@gmail.com>\n" +"PO-Revision-Date: 2021-03-08 15:33+0000\n" +"Last-Translator: Rev <revolnoom7801@gmail.com>\n" "Language-Team: Vietnamese <https://hosted.weblate.org/projects/godot-engine/" "godot/vi/>\n" "Language: vi\n" @@ -29,12 +31,13 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.2-dev\n" +"X-Generator: Weblate 4.5.1\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Invalid type argument to convert(), use TYPE_* constants." -msgstr "Hàm convert() có loại đối số không hợp lệ, sử dụng các hằng TYPE_*." +msgstr "" +"Hàm convert() có loại đối số không hợp lệ, hãy sử dụng các hằng TYPE_*." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." @@ -171,9 +174,8 @@ msgid "Anim Change Call" msgstr "Đổi Function Gọi Animation" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Keyframe Time" -msgstr "Đổi thời gian khung hình" +msgstr "Đổi nhiều thời gian khung hình" #: editor/animation_track_editor.cpp #, fuzzy @@ -206,26 +208,25 @@ msgstr "Chỉnh Vòng Lặp Hoạt Ảnh" #: editor/animation_track_editor.cpp msgid "Property Track" -msgstr "" +msgstr "Theo dõi đặc tính" #: editor/animation_track_editor.cpp msgid "3D Transform Track" -msgstr "" +msgstr "Theo dõi chuyển đổi 3D" #: editor/animation_track_editor.cpp msgid "Call Method Track" -msgstr "" +msgstr "Gọi phương thức theo dõi" #: editor/animation_track_editor.cpp msgid "Bezier Curve Track" -msgstr "" +msgstr "Theo dõi đường cong Bezier" #: editor/animation_track_editor.cpp msgid "Audio Playback Track" -msgstr "" +msgstr "Bản nhạc phát lại âm thanh" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Playback Track" msgstr "Ngưng chạy animation. (S)" @@ -238,7 +239,6 @@ msgid "Animation length (seconds)" msgstr "Độ dài hoạt ảnh (giây)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Track" msgstr "Thêm Track Animation" @@ -257,7 +257,7 @@ msgstr "Âm thanh:" #: editor/animation_track_editor.cpp msgid "Anim Clips:" -msgstr "" +msgstr "Hoạt ảnh:" #: editor/animation_track_editor.cpp msgid "Change Track Path" @@ -265,7 +265,7 @@ msgstr "Thay đổi đường dẫn Track" #: editor/animation_track_editor.cpp msgid "Toggle this track on/off." -msgstr "Bật tắt track này on/off." +msgstr "Bật hoặc tắt track này, on/off" #: editor/animation_track_editor.cpp msgid "Update Mode (How this property is set)" @@ -383,7 +383,7 @@ msgstr "Chèn Anim" #: editor/animation_track_editor.cpp msgid "AnimationPlayer can't animate itself, only other players." -msgstr "AnimationPlayer không thể tự tạo hoạt ảnh, chỉ các player khác." +msgstr "AnimationPlayer không thể tự tạo hoạt ảnh, phải nhờ các Player khác." #: editor/animation_track_editor.cpp msgid "Anim Create & Insert" @@ -407,7 +407,7 @@ msgstr "Sắp xếp lại Tracks" #: editor/animation_track_editor.cpp msgid "Transform tracks only apply to Spatial-based nodes." -msgstr "" +msgstr "Các chuyển đổi chỉ có thể áp dụng cho các node Spatial" #: editor/animation_track_editor.cpp msgid "" @@ -416,7 +416,7 @@ msgid "" "-AudioStreamPlayer2D\n" "-AudioStreamPlayer3D" msgstr "" -"Các bản âm thanh chỉ có thể trỏ đến các nút:\n" +"Các bản âm thanh chỉ có thể trỏ đến các loại:\n" "-AudioStreamPlayer\n" "-AudioStreamPlayer2D\n" "-AudioStreamPlayer3D" @@ -428,10 +428,11 @@ msgstr "Các bản hoạt ảnh chỉ có thể trỏ tới các nút AnimationP #: editor/animation_track_editor.cpp msgid "An animation player can't animate itself, only other players." msgstr "" +"Animation player không tự tạo hoạt ảnh được, phải thông qua các player khác." #: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" -msgstr "" +msgstr "Không thể thêm track mới mà không có root." #: editor/animation_track_editor.cpp msgid "Invalid track for Bezier (no suitable sub-properties)" @@ -482,14 +483,13 @@ msgid "Paste Tracks" msgstr "Dán Tracks" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Scale Keys" -msgstr "Anim Scale Keys" +msgstr "Key để scale hoạt ảnh" #: editor/animation_track_editor.cpp msgid "" "This option does not work for Bezier editing, as it's only a single track." -msgstr "" +msgstr "Tùy chọn này không áp lên Bezier được, vì nó chỉ là một track." #: editor/animation_track_editor.cpp msgid "" @@ -503,6 +503,16 @@ msgid "" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" +"Cáianimation này thuộc về một cảnh đã nhập, vì vậy những thay đổi đối với " +"các bản nhạc đã nhập sẽ không được lưu.\n" +"\n" +"Để bật khả năng thêm các bản nhạc tùy chỉnh, hãy điều hướng đến cài đặt nhập " +"của cảnh và đặt\n" +"\"animation > Lưu trữ\" thành \"Tệp\", bật \"Hoạt hình> Giữ các bản nhạc tùy " +"chỉnh\", sau đó nhập lại.(vn)\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" +"\", sau đó nhập lại (english).\n" +"Hoặc, sử dụng cài đặt trước nhập khẩu nhập hình ảnh động để tách các tệp." #: editor/animation_track_editor.cpp msgid "Warning: Editing imported animation" @@ -536,7 +546,7 @@ msgstr "Giây" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "FPS" -msgstr "" +msgstr "Khung hình(FPS)" #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp @@ -554,7 +564,7 @@ msgstr "Thuộc tính hoạt cảnh." #: editor/animation_track_editor.cpp msgid "Copy Tracks" -msgstr "" +msgstr "Sao Chép Tracks" #: editor/animation_track_editor.cpp msgid "Scale Selection" @@ -570,7 +580,7 @@ msgstr "Nhân đôi lựa chọn" #: editor/animation_track_editor.cpp msgid "Duplicate Transposed" -msgstr "" +msgstr "Chuyển đổi trùng lặp" #: editor/animation_track_editor.cpp msgid "Delete Selection" @@ -598,7 +608,7 @@ msgstr "Chọn node để được làm diễn hoạt:" #: editor/animation_track_editor.cpp msgid "Use Bezier Curves" -msgstr "" +msgstr "Sử dụng đường cong Bezier" #: editor/animation_track_editor.cpp msgid "Anim. Optimizer" @@ -606,15 +616,15 @@ msgstr "Tối ưu hóa Animation" #: editor/animation_track_editor.cpp msgid "Max. Linear Error:" -msgstr "" +msgstr "Sai lệch tuyến tính lớn nhất:" #: editor/animation_track_editor.cpp msgid "Max. Angular Error:" -msgstr "" +msgstr "Sai lệch góc lớn nhất:" #: editor/animation_track_editor.cpp msgid "Max Optimizable Angle:" -msgstr "" +msgstr "Góc lớn nhất có thể tối ưu:" #: editor/animation_track_editor.cpp msgid "Optimize" @@ -622,7 +632,7 @@ msgstr "Tối ưu" #: editor/animation_track_editor.cpp msgid "Remove invalid keys" -msgstr "Gỡ bỏ các khoá không hợp lệ" +msgstr "Xóa các khoá không hợp lệ" #: editor/animation_track_editor.cpp msgid "Remove unresolved and empty tracks" @@ -654,14 +664,13 @@ msgstr "Chọn các Track để sao chép:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "Sao chép" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "Chọn Không có" +msgstr "Chọn tất cả/ hoặc không" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -669,19 +678,19 @@ msgstr "Thêm Track Âm thanh" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" -msgstr "" +msgstr "Thay đổi thời điểm bắt đầu phát track âm thanh." #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip End Offset" -msgstr "" +msgstr "Thay đổi thời điểm kết thúc track âm thanh" #: editor/array_property_edit.cpp msgid "Resize Array" -msgstr "Đổi lại size Array" +msgstr "Thay đổi kích thước mảng" #: editor/array_property_edit.cpp msgid "Change Array Value Type" -msgstr "Đổi loại giá trị Array" +msgstr "Đổi kiểu giá trị Array" #: editor/array_property_edit.cpp msgid "Change Array Value" @@ -768,9 +777,8 @@ msgid "Method in target node must be specified." msgstr "Phương thức trong nút đích phải được chỉ định." #: editor/connections_dialog.cpp -#, fuzzy msgid "Method name must be a valid identifier." -msgstr "Phương thức trong nút đích phải được chỉ định." +msgstr "Tên phương thức phải được chỉ định." #: editor/connections_dialog.cpp msgid "" @@ -822,9 +830,8 @@ msgid "Extra Call Arguments:" msgstr "Mở rộng Đối số được gọi:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Receiver Method:" -msgstr "Lọc các nút" +msgstr "Hàm nhận:" #: editor/connections_dialog.cpp msgid "Advanced" @@ -846,7 +853,7 @@ msgstr "Một lần" #: editor/connections_dialog.cpp msgid "Disconnects the signal after its first emission." -msgstr "Ngắt kết nối tín hiệu sau lần phát xạ đầu tiên." +msgstr "Ngắt kết nối tín hiệu sau lần phát đầu tiên." #: editor/connections_dialog.cpp msgid "Cannot connect signal" @@ -864,7 +871,7 @@ msgstr "Không thể kết nối tín hiệu" #: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Close" -msgstr "Tắt" +msgstr "Đóng" #: editor/connections_dialog.cpp msgid "Connect" @@ -912,9 +919,8 @@ msgid "Signals" msgstr "Tín hiệu (Signal)" #: editor/connections_dialog.cpp -#, fuzzy msgid "Filter signals" -msgstr "Lọc tệp tin ..." +msgstr "Lọc tín hiệu" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from this signal?" @@ -978,7 +984,6 @@ msgid "Search Replacement For:" msgstr "Tìm kiếm thay thế cho:" #: editor/dependency_editor.cpp -#, fuzzy msgid "Dependencies For:" msgstr "Phần phụ thuộc cho:" @@ -1026,7 +1031,7 @@ msgstr "Trình chỉnh sửa Phụ thuộc" #: editor/dependency_editor.cpp msgid "Search Replacement Resource:" -msgstr "" +msgstr "Tìm kiếm tài nguyên thay thế:" #: editor/dependency_editor.cpp editor/editor_file_dialog.cpp #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -1090,13 +1095,12 @@ msgid "Permanently delete %d item(s)? (No undo!)" msgstr "Xoá vĩnh viễn các đối tượng %d? (Không thể hoàn lại!)" #: editor/dependency_editor.cpp -#, fuzzy msgid "Show Dependencies" -msgstr "Phần phụ thuộc cho:" +msgstr "Hiện các phần phụ thuộc" #: editor/dependency_editor.cpp msgid "Orphan Resource Explorer" -msgstr "" +msgstr "Tìm tài nguyên mất gốc" #: editor/dependency_editor.cpp editor/editor_audio_buses.cpp #: editor/editor_file_dialog.cpp editor/editor_node.cpp @@ -1464,15 +1468,15 @@ msgstr "" #: editor/editor_autoload_settings.cpp msgid "Keyword cannot be used as an autoload name." -msgstr "" +msgstr "Từ khóa không thể dùng làm tên một nạp tự động." #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" -msgstr "" +msgstr "Nạp tự động '%s' đã tồn tại!" #: editor/editor_autoload_settings.cpp msgid "Rename Autoload" -msgstr "" +msgstr "Đổi tên" #: editor/editor_autoload_settings.cpp msgid "Toggle AutoLoad Globals" @@ -1875,8 +1879,8 @@ msgid "Open a File or Directory" msgstr "Mở một tệp tin hoặc thư mục" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Lưu" @@ -2550,7 +2554,7 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." +msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" #: editor/editor_node.cpp @@ -2787,9 +2791,8 @@ msgid "Project Settings..." msgstr "Cài đặt Dự Án" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Version Control" -msgstr "Phiên bản:" +msgstr "Theo dõi phiên bản" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Set Up Version Control" @@ -2966,14 +2969,6 @@ msgid "Help" msgstr "Trợ giúp" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "Tìm kiếm" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "Tài liệu trực tuyến" @@ -2983,9 +2978,8 @@ msgid "Q&A" msgstr "Hỏi và Đáp" #: editor/editor_node.cpp -#, fuzzy msgid "Report a Bug" -msgstr "Nhập vào lại" +msgstr "Báo lỗi" #: editor/editor_node.cpp msgid "Send Docs Feedback" @@ -2997,7 +2991,7 @@ msgstr "Cộng đồng" #: editor/editor_node.cpp msgid "About" -msgstr "Thông tin chúng tôi" +msgstr "Về chúng tôi" #: editor/editor_node.cpp msgid "Play the project." @@ -3009,7 +3003,7 @@ msgstr "Chạy" #: editor/editor_node.cpp msgid "Pause the scene execution for debugging." -msgstr "" +msgstr "Dừng chạy Cảnh để gỡ lỗi." #: editor/editor_node.cpp msgid "Pause Scene" @@ -3037,7 +3031,7 @@ msgstr "Chạy Cảnh Tuỳ Chọn" #: editor/editor_node.cpp msgid "Changing the video driver requires restarting the editor." -msgstr "Thay đổi trình điều kiển Video, yêu cầu khởi động lại Trình biên tập." +msgstr "Thay đổi trình điều khiển Video cần phải khởi động lại Trình biên tập." #: editor/editor_node.cpp editor/project_settings_editor.cpp #: editor/settings_config_dialog.cpp @@ -3049,14 +3043,12 @@ msgid "Spins when the editor window redraws." msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "Liên tục" +msgstr "Cập nhật Liên tục" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" -msgstr "Đối số đã thay đổi" +msgstr "Cập nhật khi có thay đổi" #: editor/editor_node.cpp msgid "Hide Update Spinner" @@ -3072,7 +3064,7 @@ msgstr "Quan Sát Viên" #: editor/editor_node.cpp msgid "Expand Bottom Panel" -msgstr "Mở rộng bảng điều khiển phía dưới" +msgstr "Mở rộng bảng điều khiển dưới" #: editor/editor_node.cpp msgid "Output" @@ -3101,7 +3093,7 @@ msgid "" "the \"Use Custom Build\" option should be enabled in the Android export " "preset." msgstr "" -"Điều này sẽ thiết lập dự án của bạn cho các bản dựng Android tùy chỉnh bằng " +"Việc này sẽ thiết lập dự án của bạn cho các bản dựng Android tùy chỉnh bằng " "cách cài đặt nguồn mẫu thành \"res://android/build\".\n" "Bạn có thể áp dụng các sửa đổi và xây dựng APK tùy chỉnh khi xuất (thêm các " "mô-đun, thay đổi AndroidManifest.xml, ...).\n" @@ -3140,6 +3132,24 @@ msgid "Open & Run a Script" msgstr "Mở & Chạy mã lệnh" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"Các tệp sau xuất hiện trên ổ cứng gần đây hơn.\n" +"Bạn muốn làm gì đây?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "Tải lại" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "Lưu lại" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "Kế thừa mới" @@ -3176,9 +3186,8 @@ msgid "Open the previous Editor" msgstr "" #: editor/editor_node.h -#, fuzzy msgid "Warning!" -msgstr "Cảnh báo" +msgstr "Cảnh báo!" #: editor/editor_path.cpp msgid "No sub-resources found." @@ -3193,9 +3202,8 @@ msgid "Thumbnail..." msgstr "" #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Main Script:" -msgstr "Tạo Script" +msgstr "Mã lệnh chính:" #: editor/editor_plugin_settings.cpp msgid "Edit Plugin" @@ -3236,7 +3244,7 @@ msgstr "" #: editor/editor_profiler.cpp msgid "Average Time (sec)" -msgstr "" +msgstr "Thời gian trung bình (giây)" #: editor/editor_profiler.cpp msgid "Frame %" @@ -3281,7 +3289,7 @@ msgstr "" #: editor/editor_properties.cpp msgid "Bit %d, value %d" -msgstr "" +msgstr "Bit %d, giá trị %d" #: editor/editor_properties.cpp msgid "[Empty]" @@ -3347,7 +3355,7 @@ msgstr "Duy nhất" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "Dán" @@ -4049,6 +4057,21 @@ msgstr "" msgid "Saving..." msgstr "Đang lưu ..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Chế độ chọn" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Nhập vào" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Nạp mặc định" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -5027,7 +5050,7 @@ msgid "Got:" msgstr "Nhận được:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5135,7 +5158,6 @@ msgid "Sort:" msgstr "Sắp xếp:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Danh mục:" @@ -6974,6 +6996,14 @@ msgstr "Đóng Docs" msgid "Run" msgstr "Chạy" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "Tìm kiếm" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7025,16 +7055,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -7133,8 +7153,8 @@ msgstr "Tạo các điểm." msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "Cắt" @@ -7366,6 +7386,11 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Size" +msgstr "Kích thước: " + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -10026,6 +10051,13 @@ msgid "Projects" msgstr "Dự án" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "" +"Đang quét các tệp tin,\n" +"Chờ một chút ..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10396,6 +10428,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Nạp mặc định" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Cài sẵn ..." @@ -10650,6 +10687,16 @@ msgstr "" #: editor/scene_tree_dock.cpp #, fuzzy +msgid "Can't paste root node into the same scene." +msgstr "Không thể hoạt động trên các nút từ ngoại cảnh!" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "Dán các nút" + +#: editor/scene_tree_dock.cpp +#, fuzzy msgid "Detach Script" msgstr "Đính kèm Script" @@ -10777,6 +10824,11 @@ msgid "Attach Script" msgstr "Đính kèm Script" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "Cắt các nút" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "Xóa các nút" @@ -12432,6 +12484,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12687,11 +12747,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index 2c46f95dc0..deca89e9ea 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -43,7 +43,7 @@ # Song DongHui <14729626293@163.com>, 2019. # simano clio <sim2cle@gmail.com>, 2019. # ByonkoGalilei <byonko@qq.com>, 2019. -# qjyqjyqjyqjy <qjyqjyqjyqjy@sina.com.cn>, 2019. +# qjyqjyqjyqjy <qjyqjyqjyqjy@sina.com.cn>, 2019, 2021. # liushuyu011 <liushuyu011@gmail.com>, 2019. # DS <dseqrasd@126.com>, 2019. # ZeroAurora <zeroaurora@qq.com>, 2019. @@ -58,7 +58,7 @@ # idleman <1524328475@qq.com>, 2019. # king <wangding1992@126.com>, 2019. # silentbird <silentbird520@outlook.com>, 2019. -# Haoyu Qiu <timothyqiu32@gmail.com>, 2019, 2020. +# Haoyu Qiu <timothyqiu32@gmail.com>, 2019, 2020, 2021. # Revan Ji <jiruifancr@gmail.com>, 2020. # nieyuanhong <15625988003@163.com>, 2020. # binotaliu <binota@protonmail.ch>, 2020. @@ -71,15 +71,18 @@ # MintSoda <lionlxh@qq.com>, 2020. # Gardner Belgrade <hapenia@sina.com>, 2020. # godhidden <z2zz2zz@yahoo.com>, 2020. -# BinotaLIU <me@binota.org>, 2020. +# BinotaLIU <me@binota.org>, 2020, 2021. # TakWolf <takwolf@foxmail.com>, 2020. # twoBornottwoB <305766341@qq.com>, 2021. +# Magian <magian1127@gmail.com>, 2021. +# Weiduo Xie <xwditfr@gmail.com>, 2021. +# suplife <2634557184@qq.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2021-01-22 10:21+0000\n" -"Last-Translator: twoBornottwoB <305766341@qq.com>\n" +"PO-Revision-Date: 2021-03-16 10:40+0000\n" +"Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hans/>\n" "Language: zh_CN\n" @@ -87,7 +90,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -96,13 +99,13 @@ msgstr "convert() 的参数类型无效,请使用 TYPE_* 常量。" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "应为长度 1 的字符串(1 字符)。" +msgstr "应为长度为 1 的字符串(1 字符)。" #: 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 "没有足够的字节可解码或格式无效。" +msgstr "解码字节数不够,或格式无效。" #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" @@ -708,7 +711,7 @@ msgstr "选择要复制的轨道" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "复制" @@ -1896,8 +1899,8 @@ msgid "Open a File or Directory" msgstr "打开文件或目录" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "保存" @@ -2552,8 +2555,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "无法在 “%s” 上启用加载项插件:配置解析失败。" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "无法在 “res://addons/%s” 中找到加载项插件的脚本字段。" +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "无法在 “%s” 上找到加载项的 script 字段。" #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2693,7 +2696,7 @@ msgstr "专注模式" #: editor/editor_node.cpp msgid "Toggle distraction-free mode." -msgstr "进入/离开专注模式。" +msgstr "切换专注模式。" #: editor/editor_node.cpp msgid "Add a new scene." @@ -2933,7 +2936,7 @@ msgstr "截图将保存在编辑器数据或设置文件夹中。" #: editor/editor_node.cpp msgid "Toggle Fullscreen" -msgstr "进入/离开全屏模式" +msgstr "切换全屏模式" #: editor/editor_node.cpp msgid "Toggle System Console" @@ -2964,14 +2967,6 @@ msgid "Help" msgstr "帮助" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "搜索" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "在线文档" @@ -3133,6 +3128,24 @@ msgid "Open & Run a Script" msgstr "打开并运行脚本" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"磁盘中的下列文件较新。\n" +"应该执行什么操作?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "重新加载" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "重新保存" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "新建继承" @@ -3339,7 +3352,7 @@ msgstr "唯一化" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "粘贴" @@ -3773,7 +3786,7 @@ msgstr "全部折叠" #: editor/filesystem_dock.cpp msgid "Duplicate..." -msgstr "重复..." +msgstr "复制为..." #: editor/filesystem_dock.cpp msgid "Move to Trash" @@ -4031,6 +4044,18 @@ msgstr "有在 `post_import()` 方法中返回继承了 Node 的对象吗?" msgid "Saving..." msgstr "保存中..." +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "选择导入器" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "导入器:" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "重置为默认值" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d 个文件" @@ -4691,7 +4716,7 @@ msgstr "过渡已存在!" #: editor/plugins/animation_state_machine_editor.cpp msgid "Add Transition" -msgstr "添加转换" +msgstr "添加过渡" #: editor/plugins/animation_state_machine_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -4732,7 +4757,7 @@ msgstr "节点已移除" #: editor/plugins/animation_state_machine_editor.cpp msgid "Transition Removed" -msgstr "转换已移除" +msgstr "过渡已移除" #: editor/plugins/animation_state_machine_editor.cpp msgid "Set Start Node (Autoplay)" @@ -4955,7 +4980,7 @@ msgstr "无法将响应保存到:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Write error." -msgstr "写错误。" +msgstr "写入错误。" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, too many redirects" @@ -4986,7 +5011,7 @@ msgid "Got:" msgstr "获得:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "SHA-256 哈希值校验失败" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5090,7 +5115,6 @@ msgid "Sort:" msgstr "排序:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "分类:" @@ -5119,7 +5143,6 @@ msgid "Assets ZIP File" msgstr "素材 ZIP 文件" #: editor/plugins/baked_lightmap_editor_plugin.cpp -#, fuzzy msgid "" "Can't determine a save path for lightmap images.\n" "Save your scene and try again." @@ -5140,18 +5163,18 @@ msgstr "创建光照贴图失败,切确保文件是可写的。" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed determining lightmap size. Maximum lightmap size too small?" -msgstr "" +msgstr "无法确定光照贴图大小。最大光照贴图大小太小?" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" "Some mesh is invalid. Make sure the UV2 channel values are contained within " "the [0.0,1.0] square region." -msgstr "" +msgstr "某些网格无效。确保UV2通道值包含在[0.0,1.0]平方区域内。" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" "Godot editor was built without ray tracing support, lightmaps can't be baked." -msgstr "" +msgstr "Godot编辑器是在没有光线跟踪支持的情况下构建的,光照贴图无法烘焙。" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Bake Lightmaps" @@ -5159,7 +5182,7 @@ msgstr "烘焙光照贴图" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Select lightmap bake file:" -msgstr "选择模板文件:" +msgstr "选择光照贴图烘焙文件:" #: editor/plugins/camera_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5812,7 +5835,7 @@ msgstr "发射色彩" #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" -msgstr "CPUParticles" +msgstr "CPU粒子" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp @@ -5826,11 +5849,11 @@ msgstr "从节点创建发射点" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 0" -msgstr "Flat 0" +msgstr "平面 0" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 1" -msgstr "Flat 1" +msgstr "平面 1" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" @@ -5894,7 +5917,7 @@ msgstr "鼠标右键添加点" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" -msgstr "烘培 GI 探针" +msgstr "烘焙 GI 探针" #: editor/plugins/gradient_editor_plugin.cpp msgid "Gradient Edited" @@ -5990,7 +6013,7 @@ msgstr "网格没有可用来创建轮廓的表面!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!" -msgstr "Mesh 原始类型不是 PRIMITIVE_TRIANGLES!" +msgstr "网格的原始类型不是 PRIMITIVE_TRIANGLES!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Could not create outline!" @@ -6154,7 +6177,7 @@ msgstr "表面的源无效(路径无效)。" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Surface source is invalid (no geometry)." -msgstr "表面的源无效(无几何)。" +msgstr "表面的源无效(无几何体)。" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Surface source is invalid (no faces)." @@ -6194,7 +6217,7 @@ msgstr "Y 轴" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Z-Axis" -msgstr "Z轴" +msgstr "Z 轴" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh Up Axis:" @@ -6239,9 +6262,8 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "只可设为指向 ParticlesMaterial 处理材料" #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Convert to CPUParticles2D" -msgstr "转换为 CPUParticles" +msgstr "转换为 CPUParticles2D" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp @@ -6270,7 +6292,7 @@ msgstr "“%s” 不包含面几何体。" #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emitter" -msgstr "创建发射器 (Emitter)" +msgstr "创建发射器" #: editor/plugins/particles_editor_plugin.cpp msgid "Emission Points:" @@ -6887,6 +6909,14 @@ msgstr "关闭文档" msgid "Run" msgstr "运行" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "搜索" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "单步进入" @@ -6940,16 +6970,6 @@ msgstr "" "磁盘中的下列文件已更新。\n" "请选择执行哪项操作?:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "重新加载" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "重新保存" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "调试器" @@ -7042,8 +7062,8 @@ msgstr "断点" msgid "Go To" msgstr "转到" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "剪切" @@ -7266,6 +7286,10 @@ msgid "Yaw" msgstr "偏航角" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "大小" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "绘制对象" @@ -9891,6 +9915,10 @@ msgid "Projects" msgstr "项目" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "正在加载,请稍候..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "修改时间" @@ -10256,6 +10284,10 @@ msgstr "自动加载" msgid "Plugins" msgstr "插件" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "默认导入设置" + #: editor/property_editor.cpp msgid "Preset..." msgstr "预设..." @@ -10503,6 +10535,14 @@ msgid "Instance Child Scene" msgstr "实例化子场景" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "不能将根节点粘贴进相同场景。" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "粘贴节点" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "分离脚本" @@ -10625,6 +10665,10 @@ msgid "Attach Script" msgstr "添加脚本" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "剪切节点" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "移除节点" @@ -11425,35 +11469,31 @@ msgstr "向此 GridMap 提供网格库资源以使用其网格。" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Begin Bake" -msgstr "" +msgstr "开始烘焙" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Preparing data structures" -msgstr "" +msgstr "准备数据结构" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Generate buffers" -msgstr "生成 AABB" +msgstr "生成缓冲区" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Direct lighting" -msgstr "方向" +msgstr "直接照明" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Indirect lighting" -msgstr "向右缩进" +msgstr "间接照明" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Post processing" -msgstr "后期处理" +msgstr "后处理" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Plotting lightmaps" -msgstr "正在绘制灯光" +msgstr "绘制光照图" #: modules/mono/csharp_script.cpp msgid "Class name can't be a reserved keyword" @@ -11465,7 +11505,7 @@ msgstr "内部异常堆栈追朔结束" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Bake NavMesh" -msgstr "烘焙导航网" +msgstr "烘焙导航网格" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Clear the navigation mesh." @@ -11954,9 +11994,8 @@ msgid "Select device from the list" msgstr "从列表中选择设备" #: platform/android/export/export.cpp -#, fuzzy msgid "Unable to find the 'apksigner' tool." -msgstr "未找到 zipalign 工具。" +msgstr "找不到“apksigner”工具。" #: platform/android/export/export.cpp msgid "" @@ -11973,14 +12012,12 @@ msgid "Release keystore incorrectly configured in the export preset." msgstr "用于发布的密钥存储在导出预设中未被正确设置。" #: platform/android/export/export.cpp -#, fuzzy msgid "A valid Android SDK path is required in Editor Settings." -msgstr "用于 “编辑器设置” 中自定义构建的 Android SDK 路径是无效的。" +msgstr "编辑器设置中需要有效的Android SDK路径。" #: platform/android/export/export.cpp -#, fuzzy msgid "Invalid Android SDK path in Editor Settings." -msgstr "用于 “编辑器设置” 中自定义构建的 Android SDK 路径是无效的。" +msgstr "编辑器设置中的Android SDK路径无效。" #: platform/android/export/export.cpp msgid "Missing 'platform-tools' directory!" @@ -11988,12 +12025,11 @@ msgstr "缺失“platform-tools”目录!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK platform-tools' adb command." -msgstr "" +msgstr "找不到Android SDK平台工具的adb命令。" #: platform/android/export/export.cpp -#, fuzzy msgid "Please check in the Android SDK directory specified in Editor Settings." -msgstr "用于 “编辑器设置” 中自定义构建的 Android SDK 路径是无效的。" +msgstr "请签入编辑器设置中指定的Android SDK目录。" #: platform/android/export/export.cpp msgid "Missing 'build-tools' directory!" @@ -12001,7 +12037,7 @@ msgstr "缺失“build-tools”目录!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK build-tools' apksigner command." -msgstr "" +msgstr "找不到Android SDK生成工具的apksigner命令。" #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." @@ -12244,6 +12280,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "空的 CollisionPolygon2D 不起任何碰撞检测作用。" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "多边形无效。“Solids”构建模式需要至少三个点。" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "多边形无效。“Segments”构建模式需要至少两个点。" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12431,27 +12475,23 @@ msgstr "ARVROrigin 需要一个 ARVRCamera 子节点。" #: scene/3d/baked_lightmap.cpp msgid "Finding meshes and lights" -msgstr "" +msgstr "正在查找网格和灯光" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing geometry (%d/%d)" -msgstr "解析多边形中..." +msgstr "正在准备几何体(%d/%d)" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing environment" -msgstr "查看环境" +msgstr "正在准备环境" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Generating capture" -msgstr "正在生成光照贴图" +msgstr "正在生成捕获" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Saving lightmaps" -msgstr "正在生成光照贴图" +msgstr "正在保存光照贴图" #: scene/3d/baked_lightmap.cpp msgid "Done" @@ -12534,11 +12574,6 @@ msgstr "" "GLES2 视频驱动程序不支持 GIProbes。\n" "请改用 BakedLightmap。" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera 已废弃,将在 Godot 4.0 中删除。" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "角度宽于 90 度的 SpotLight 无法投射出阴影。" @@ -12833,7 +12868,7 @@ msgstr "Viewport 大小大于 0 时才能进行渲染。" msgid "" "The sampler port is connected but not used. Consider changing the source to " "'SamplerPort'." -msgstr "" +msgstr "采样器端口已连接但未使用。考虑将源更改为“SamplerPort”。" #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." @@ -12863,6 +12898,10 @@ msgstr "变量只能在顶点函数中指定。" msgid "Constants cannot be modified." msgstr "不允许修改常量。" +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "InterpolatedCamera 已废弃,将在 Godot 4.0 中删除。" + #~ msgid "No" #~ msgstr "否" @@ -14510,9 +14549,6 @@ msgstr "不允许修改常量。" #~ msgid "Use Default Light" #~ msgstr "使用默认光照" -#~ msgid "Use Default sRGB" -#~ msgstr "使用默认sRGB" - #~ msgid "Default Light Normal:" #~ msgstr "默认光照法线:" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index 99d673b0fa..2009ba8f20 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -682,7 +682,7 @@ msgstr "選擇模式" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "複製" @@ -1922,8 +1922,8 @@ msgid "Open a File or Directory" msgstr "選擇資料夾/檔案" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "儲存" @@ -2598,8 +2598,9 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "" +#, fuzzy +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "載入字形出現錯誤" #: editor/editor_node.cpp #, fuzzy @@ -3029,14 +3030,6 @@ msgid "Help" msgstr "幫助" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "搜尋" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp #, fuzzy msgid "Online Docs" @@ -3199,6 +3192,22 @@ msgid "Open & Run a Script" msgstr "" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "" + +#: editor/editor_node.cpp #, fuzzy msgid "New Inherited" msgstr "下一個腳本" @@ -3416,7 +3425,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "貼上" @@ -4164,6 +4173,21 @@ msgstr "" msgid "Saving..." msgstr "儲存中..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "選擇模式" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "導入" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "預設" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -5190,7 +5214,7 @@ msgid "Got:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5304,7 +5328,6 @@ msgid "Sort:" msgstr "排序:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "分類:" @@ -7164,6 +7187,14 @@ msgstr "關閉場景" msgid "Run" msgstr "運行" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "搜尋" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "" @@ -7218,16 +7249,6 @@ msgid "" "What action should be taken?:" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "" @@ -7329,8 +7350,8 @@ msgstr "刪除" msgid "Go To" msgstr "" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "剪下" @@ -7569,6 +7590,10 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "" @@ -10251,6 +10276,11 @@ msgid "Projects" msgstr "專案" #: editor/project_manager.cpp +#, fuzzy +msgid "Loading, please wait..." +msgstr "接收 mirrors中, 請稍侯..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "" @@ -10627,6 +10657,11 @@ msgstr "" msgid "Plugins" msgstr "插件" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "預設" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -10885,6 +10920,15 @@ msgid "Instance Child Scene" msgstr "" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Paste Node(s)" +msgstr "貼上" + +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Detach Script" msgstr "腳本" @@ -11019,6 +11063,11 @@ msgid "Attach Script" msgstr "腳本" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Cut Node(s)" +msgstr "貼上" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "" @@ -12705,6 +12754,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12962,11 +13019,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13451,10 +13503,6 @@ msgstr "" #~ msgstr "新增資料夾" #, fuzzy -#~ msgid "Custom Node" -#~ msgstr "貼上" - -#, fuzzy #~ msgid "Invalid Path" #~ msgstr "有效的路徑" diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index a1228463b9..62ef5a616c 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -29,7 +29,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-01-01 10:30+0000\n" +"PO-Revision-Date: 2021-03-16 10:40+0000\n" "Last-Translator: BinotaLIU <me@binota.org>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hant/>\n" @@ -38,7 +38,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.4.1-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -659,7 +659,7 @@ msgstr "選擇軌道以複製" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Copy" msgstr "複製" @@ -1851,8 +1851,8 @@ msgid "Open a File or Directory" msgstr "開啟檔案或資料夾" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "保存" @@ -2364,7 +2364,7 @@ msgstr "未定義欲執行之場景。" #: editor/editor_node.cpp msgid "Save scene before running..." -msgstr "" +msgstr "執行前先保存場景..." #: editor/editor_node.cpp msgid "Could not start subprocess!" @@ -2505,8 +2505,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "無法在「%s」上啟用擴充功能,解析組態設定失敗。" #: editor/editor_node.cpp -msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "無法在擴充功能「res://addons/%s」中無法找到腳本欄位。" +msgid "Unable to find script field for addon plugin at: '%s'." +msgstr "無法在擴充功能「r%s」中找到腳本欄位。" #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2917,14 +2917,6 @@ msgid "Help" msgstr "說明" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp -#: editor/plugins/script_text_editor.cpp -#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp -#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp -#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp -msgid "Search" -msgstr "搜尋" - -#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" msgstr "線上說明文件" @@ -3086,6 +3078,24 @@ msgid "Open & Run a Script" msgstr "開啟並執行腳本" #: editor/editor_node.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?" +msgstr "" +"磁碟中的下列檔案已更新。\n" +"要執行什麼操作?" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Reload" +msgstr "重新載入" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Resave" +msgstr "重新保存" + +#: editor/editor_node.cpp msgid "New Inherited" msgstr "新增繼承" @@ -3292,7 +3302,7 @@ msgstr "獨立化" #: editor/plugins/script_text_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp -#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp +#: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" msgstr "貼上" @@ -3984,6 +3994,18 @@ msgstr "是否有在 `post_import()` 方法內回傳繼承 Node 之物件?" msgid "Saving..." msgstr "正在保存..." +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "選擇匯入程式" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "匯入程式:" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "重設為預設" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d 個檔案" @@ -4939,7 +4961,7 @@ msgid "Got:" msgstr "獲得:" #: editor/plugins/asset_library_editor_plugin.cpp -msgid "Failed sha256 hash check" +msgid "Failed SHA-256 hash check" msgstr "SHA-256 雜湊檢查失敗" #: editor/plugins/asset_library_editor_plugin.cpp @@ -5043,7 +5065,6 @@ msgid "Sort:" msgstr "排序:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "分類:" @@ -5072,14 +5093,12 @@ msgid "Assets ZIP File" msgstr "素材 ZIP 檔" #: editor/plugins/baked_lightmap_editor_plugin.cpp -#, fuzzy msgid "" "Can't determine a save path for lightmap images.\n" "Save your scene and try again." msgstr "" "無法判斷光照圖的保存路徑。\n" -"請保存場景(圖片將保存於相同資料夾),或是在 BackedLightmap 屬性內選擇一個保" -"存路徑。" +"請保存場景並重試。" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" @@ -5094,27 +5113,27 @@ msgstr "建立光照圖失敗,請確保該路徑可寫入。" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed determining lightmap size. Maximum lightmap size too small?" -msgstr "" +msgstr "無法判斷光照圖大小。最大光照圖大小是否過小?" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" "Some mesh is invalid. Make sure the UV2 channel values are contained within " "the [0.0,1.0] square region." -msgstr "" +msgstr "部分網格無效。請確保 UV2 通道的值位於 [0.0,1.0] 矩形內。" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" "Godot editor was built without ray tracing support, lightmaps can't be baked." msgstr "" +"Godot 編輯器在建制時未啟用光線追蹤 (Ray Tracing) 支援,無法烘焙光照圖。" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Bake Lightmaps" msgstr "烘焙光照圖" #: editor/plugins/baked_lightmap_editor_plugin.cpp -#, fuzzy msgid "Select lightmap bake file:" -msgstr "選擇樣板檔案" +msgstr "選擇光照圖烘焙檔案:" #: editor/plugins/camera_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -6194,9 +6213,8 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "僅可設為指向 ProticlesMaterial 處理材料" #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Convert to CPUParticles2D" -msgstr "轉換為 CPUParticles" +msgstr "轉換為 CPUParticles2D" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp @@ -6842,6 +6860,14 @@ msgstr "關閉說明文件" msgid "Run" msgstr "執行" +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp +#: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp +msgid "Search" +msgstr "搜尋" + #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" msgstr "逐步執行" @@ -6895,16 +6921,6 @@ msgstr "" "磁碟中的下列檔案已更新。\n" "請選擇於執行之操作:" -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Reload" -msgstr "重新載入" - -#: editor/plugins/script_editor_plugin.cpp -#: editor/plugins/shader_editor_plugin.cpp -msgid "Resave" -msgstr "重新保存" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" msgstr "除錯工具" @@ -6997,8 +7013,8 @@ msgstr "中斷點" msgid "Go To" msgstr "跳至" -#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp -#: scene/gui/text_edit.cpp +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Cut" msgstr "剪下" @@ -7221,6 +7237,10 @@ msgid "Yaw" msgstr "偏航" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Size" +msgstr "大小" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" msgstr "繪製的物件" @@ -9847,6 +9867,10 @@ msgid "Projects" msgstr "專案" #: editor/project_manager.cpp +msgid "Loading, please wait..." +msgstr "載入中,請稍後..." + +#: editor/project_manager.cpp msgid "Last Modified" msgstr "最後修改時間" @@ -10211,6 +10235,10 @@ msgstr "Autoload" msgid "Plugins" msgstr "外掛" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "匯入預設" + #: editor/property_editor.cpp msgid "Preset..." msgstr "預設設定..." @@ -10458,6 +10486,14 @@ msgid "Instance Child Scene" msgstr "實體化子場景" #: editor/scene_tree_dock.cpp +msgid "Can't paste root node into the same scene." +msgstr "無法將跟節點貼到相同的場景中。" + +#: editor/scene_tree_dock.cpp +msgid "Paste Node(s)" +msgstr "貼上節點" + +#: editor/scene_tree_dock.cpp msgid "Detach Script" msgstr "取消附加腳本" @@ -10580,6 +10616,10 @@ msgid "Attach Script" msgstr "附加腳本" #: editor/scene_tree_dock.cpp +msgid "Cut Node(s)" +msgstr "剪下節點" + +#: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "移除節點" @@ -11380,36 +11420,31 @@ msgstr "提供 MeshLibrary 予該 GridMap 以使用其網格。" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Begin Bake" -msgstr "" +msgstr "開始烘焙" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Preparing data structures" -msgstr "" +msgstr "正在準備資料結構" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Generate buffers" -msgstr "產生 AABB" +msgstr "產生緩衝" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Direct lighting" -msgstr "方向" +msgstr "向性光照" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Indirect lighting" -msgstr "向右縮排" +msgstr "非向性光照" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Post processing" msgstr "後處理" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Plotting lightmaps" -msgstr "正在繪製光照:" +msgstr "正在繪製光照" #: modules/mono/csharp_script.cpp msgid "Class name can't be a reserved keyword" @@ -11909,9 +11944,8 @@ msgid "Select device from the list" msgstr "自清單中選擇裝置" #: platform/android/export/export.cpp -#, fuzzy msgid "Unable to find the 'apksigner' tool." -msgstr "找不到 zipalign 工具。" +msgstr "找不到「apksigner」工具。" #: platform/android/export/export.cpp msgid "" @@ -11928,14 +11962,12 @@ msgid "Release keystore incorrectly configured in the export preset." msgstr "發行金鑰儲存區中不正確之組態設定至匯出預設設定。" #: platform/android/export/export.cpp -#, fuzzy msgid "A valid Android SDK path is required in Editor Settings." -msgstr "編輯器設定中用於自定義設定之 Android SDK 路徑無效。" +msgstr "必須於 [編輯器設定] 中提供一個有效的 Android SDK 路徑。" #: platform/android/export/export.cpp -#, fuzzy msgid "Invalid Android SDK path in Editor Settings." -msgstr "編輯器設定中用於自定義設定之 Android SDK 路徑無效。" +msgstr "[編輯器設定] 中所指定的 Android SDK 路徑無效。" #: platform/android/export/export.cpp msgid "Missing 'platform-tools' directory!" @@ -11943,12 +11975,11 @@ msgstr "缺少「platform-tools」資料夾!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK platform-tools' adb command." -msgstr "" +msgstr "找不到 Android SDK platform-tools 的 adb 指令。" #: platform/android/export/export.cpp -#, fuzzy msgid "Please check in the Android SDK directory specified in Editor Settings." -msgstr "編輯器設定中用於自定義設定之 Android SDK 路徑無效。" +msgstr "請檢查 [編輯器設定] 中所指定的 Android SDK 資料夾。" #: platform/android/export/export.cpp msgid "Missing 'build-tools' directory!" @@ -11956,7 +11987,7 @@ msgstr "缺少「build-tools」資料夾!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK build-tools' apksigner command." -msgstr "" +msgstr "找不到 Android SDK build-tools 的 apksigner 指令。" #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." @@ -12204,6 +12235,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "空白的 CollisionPolygon2D 不會產生任何碰撞效果。" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "無效的多邊形。至少必須有三個點為「Solids」建構模式。" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "無效的多邊形。至少必須有 2 個點為「Segments」建構模式。" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12391,32 +12430,27 @@ msgstr "ARVROrigin 必須有一個 ARVRCamera 子節點。" #: scene/3d/baked_lightmap.cpp msgid "Finding meshes and lights" -msgstr "" +msgstr "正在尋找網格與光照" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing geometry (%d/%d)" -msgstr "正在解析多邊形..." +msgstr "正在解析幾何 (%d/%d)" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing environment" -msgstr "檢視環境" +msgstr "正在準備環境" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Generating capture" -msgstr "正在產生光照圖" +msgstr "正在產生捕捉" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Saving lightmaps" -msgstr "正在產生光照圖" +msgstr "正在保存光照圖" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Done" -msgstr "完成!" +msgstr "完成" #: scene/3d/collision_object.cpp msgid "" @@ -12494,11 +12528,6 @@ msgstr "" "GLES2 視訊驅動程式不支援 GIProbes。\n" "請改為使用 BakedLightmap。" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera 已停止維護,且將於 Godot 4.0 中移除。" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "角度大於 90 度的 SpotLight 無法投射出陰影。" @@ -12794,7 +12823,7 @@ msgstr "Viewport 大小必須大於 0 才可進行算繪。" msgid "" "The sampler port is connected but not used. Consider changing the source to " "'SamplerPort'." -msgstr "" +msgstr "已連線至取樣器連結埠但並未使用。建議將來源設為「SamplerPort」。" #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." @@ -12824,6 +12853,10 @@ msgstr "Varying 變數只可在頂點函式中指派。" msgid "Constants cannot be modified." msgstr "不可修改常數。" +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "InterpolatedCamera 已停止維護,且將於 Godot 4.0 中移除。" + #~ msgid "No" #~ msgstr "否" |