1
0
Fork 0

Merge branch 'master' of https://github.com/godotengine/godot into feat-cam-mjpeg

This commit is contained in:
Philip Whitfield 2025-02-12 10:53:25 +01:00
commit c7187bd3a0
512 changed files with 462358 additions and 114852 deletions

View File

@ -103,7 +103,27 @@ jobs:
cd ../../..
ls -l bin/android_editor_builds/
# Separate different editors for multiple artifacts
mkdir horizonos
mv bin/android_editor_builds/*-horizonos-* horizonos
mkdir picoos
mv bin/android_editor_builds/*-picoos-* picoos
- name: Upload artifact
uses: ./.github/actions/upload-artifact
with:
name: ${{ matrix.cache-name }}
- name: Upload artifact (Horizon OS)
if: matrix.target == 'editor'
uses: ./.github/actions/upload-artifact
with:
name: ${{ matrix.cache-name }}-horizonos
path: horizonos
- name: Upload artifact (PICO OS)
if: matrix.target == 'editor'
uses: ./.github/actions/upload-artifact
with:
name: ${{ matrix.cache-name }}-picoos
path: picoos

View File

@ -74,7 +74,7 @@ jobs:
artifact: false
cache-limit: 5
- name: Template w/ Mono (target=template_release, tests=yes)
- name: Template w/ Mono, release (target=template_release, tests=yes)
cache-name: linux-template-mono
target: template_release
sconsflags: module_mono_enabled=yes
@ -84,6 +84,16 @@ jobs:
artifact: true
cache-limit: 1
- name: Template w/ Mono, debug (target=template_debug, tests=yes)
cache-name: linux-template-mono-debug
target: template_debug
sconsflags: module_mono_enabled=yes
bin: ./bin/godot.linuxbsd.template_debug.x86_64.mono
build-mono: false
tests: true
artifact: true
cache-limit: 1
- name: Minimal template (target=template_release, tests=yes, everything disabled)
cache-name: linux-template-minimal
target: template_release
@ -105,7 +115,7 @@ jobs:
run: |
sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EB8B81E14DA65431D7504EA8F63F0F2B90935439
sudo add-apt-repository "deb https://ppa.launchpadcontent.net/kisak/turtle/ubuntu ${{ matrix.os == 'ubuntu-20.04' && 'focal' || 'jammy' }} main"
sudo add-apt-repository "deb https://ppa.launchpadcontent.net/kisak/turtle/ubuntu jammy main"
sudo apt-get install -qq mesa-vulkan-drivers
# TODO: Figure out somehow how to embed this one.

1
.gitignore vendored
View File

@ -363,6 +363,7 @@ cpp.hint
# macOS
.DS_Store
__MACOSX
Godot.app
# Windows
# https://github.com/github/gitignore/blob/main/Global/Windows.gitignore

View File

@ -61,6 +61,15 @@ Copyright: 2011, Ole Kniemeyer, MAXON, www.maxon.net
2007-2014, Juan Linietsky, Ariel Manzur
License: Expat and Zlib
Files: modules/betsy/alpha_stitch.glsl
modules/betsy/bc1.glsl
modules/betsy/bc4.glsl
modules/betsy/bc6h.glsl
modules/betsy/CrossPlatformSettings_piece_all.glsl
Comment: Betsy
Copyright: 2020-2022, Matias N. Goldberg
License: Expat
Files: modules/godot_physics_2d/godot_joints_2d.cpp
Comment: Chipmunk2D Joint Constraints
Copyright: 2007, Scott Lembcke
@ -179,11 +188,6 @@ Comment: Basis Universal
Copyright: 2019-2024, Binomial LLC.
License: Apache-2.0
Files: thirdparty/betsy/*
Comment: Betsy
Copyright: 2020-2022, Matias N. Goldberg
License: Expat
Files: thirdparty/brotli/*
Comment: Brotli
Copyright: 2009, 2010, 2013-2016 by the Brotli Authors.
@ -407,6 +411,11 @@ Comment: FastLZ
Copyright: 2005-2020, Ariya Hidayat
License: Expat
Files: thirdparty/misc/FastNoiseLite.h
Comment: FastNoise Lite
Copyright: 2023, Jordan Peck and contributors
License: Expat
Files: thirdparty/misc/ifaddrs-android.cc
thirdparty/misc/ifaddrs-android.h
Comment: libjingle
@ -419,17 +428,17 @@ Comment: Tangent Space Normal Maps implementation
Copyright: 2011, Morten S. Mikkelsen
License: Zlib
Files: thirdparty/misc/nvapi_minimal.h
Comment: NVIDIA NVAPI (minimal excerpt)
Copyright: 2019-2022, NVIDIA Corporation
License: Expat
Files: thirdparty/misc/ok_color.h
thirdparty/misc/ok_color_shader.h
Comment: OK Lab color space
Copyright: 2021, Björn Ottosson
License: Expat
Files: thirdparty/noise/FastNoiseLite.h
Comment: FastNoise Lite
Copyright: 2023, Jordan Peck and contributors
License: Expat
Files: thirdparty/misc/pcg.cpp
thirdparty/misc/pcg.h
Comment: Minimal PCG32 implementation
@ -480,11 +489,6 @@ Comment: Multi-channel signed distance field generator
Copyright: 2014-2024, Viktor Chlumsky
License: Expat
Files: thirdparty/nvapi/nvapi_minimal.h
Comment: Stripped down version of "nvapi.h" from the NVIDIA NVAPI SDK
Copyright: 2019-2022, NVIDIA Corporation
License: Expat
Files: thirdparty/openxr/*
Comment: OpenXR Loader
Copyright: 2020-2023, The Khronos Group Inc.

View File

@ -33,6 +33,7 @@
#include "core/core_globals.h"
#include "core/io/dir_access.h"
#include "core/os/time.h"
#include "core/templates/rb_set.h"
#include "modules/modules_enabled.gen.h" // For regex.
#ifdef MODULE_REGEX_ENABLED
@ -129,7 +130,9 @@ void RotatedFileLogger::clear_old_backups() {
da->list_dir_begin();
String f = da->get_next();
HashSet<String> backups;
// backups is a RBSet because it guarantees that iterating on it is done in sorted order.
// RotatedFileLogger depends on this behavior to delete the oldest log file first.
RBSet<String> backups;
while (!f.is_empty()) {
if (!da->current_is_dir() && f.begins_with(basename) && f.get_extension() == extension && f != base_path.get_file()) {
backups.insert(f);
@ -138,12 +141,12 @@ void RotatedFileLogger::clear_old_backups() {
}
da->list_dir_end();
if (backups.size() > (uint32_t)max_backups) {
if (backups.size() > max_backups) {
// since backups are appended with timestamp and Set iterates them in sorted order,
// first backups are the oldest
int to_delete = backups.size() - max_backups;
for (HashSet<String>::Iterator E = backups.begin(); E && to_delete > 0; ++E, --to_delete) {
da->remove(*E);
for (RBSet<String>::Element *E = backups.front(); E && to_delete > 0; E = E->next(), --to_delete) {
da->remove(E->get());
}
}
}

View File

@ -1196,6 +1196,20 @@ bool ResourceLoader::has_custom_uid_support(const String &p_path) {
return false;
}
bool ResourceLoader::should_create_uid_file(const String &p_path) {
const String local_path = _validate_local_path(p_path);
if (FileAccess::exists(local_path + ".uid")) {
return false;
}
for (int i = 0; i < loader_count; i++) {
if (loader[i]->recognize_path(local_path)) {
return !loader[i]->has_custom_uid_support();
}
}
return false;
}
String ResourceLoader::_path_remap(const String &p_path, bool *r_translation_remapped) {
String new_path = p_path;

View File

@ -246,6 +246,7 @@ public:
static String get_resource_script_class(const String &p_path);
static ResourceUID::ID get_resource_uid(const String &p_path);
static bool has_custom_uid_support(const String &p_path);
static bool should_create_uid_file(const String &p_path);
static void get_dependencies(const String &p_path, List<String> *p_dependencies, bool p_add_types = false);
static Error rename_dependencies(const String &p_path, const HashMap<String, String> &p_map);
static bool is_import_valid(const String &p_path);

View File

@ -154,6 +154,19 @@ String ResourceUID::get_id_path(ID p_id) const {
ERR_FAIL_COND_V_MSG(p_id == INVALID_ID, String(), "Invalid UID.");
MutexLock l(mutex);
const ResourceUID::Cache *cache = unique_ids.getptr(p_id);
#if TOOLS_ENABLED
// On startup, the scan_for_uid_on_startup callback should be set and will
// execute EditorFileSystem::scan_for_uid, which scans all project files
// to reload the UID cache before the first scan.
// Note: EditorFileSystem::scan_for_uid sets scan_for_uid_on_startup to nullptr
// once the first scan_for_uid is complete.
if (!cache && scan_for_uid_on_startup) {
scan_for_uid_on_startup();
cache = unique_ids.getptr(p_id);
}
#endif
ERR_FAIL_COND_V_MSG(!cache, String(), vformat("Unrecognized UID: \"%s\".", id_to_text(p_id)));
const CharString &cs = cache->cs;
return String::utf8(cs.ptr());

View File

@ -37,6 +37,8 @@
class FileAccess;
typedef void (*ResourceUIDScanForUIDOnStartup)();
class ResourceUID : public Object {
GDCLASS(ResourceUID, Object)
public:
@ -63,6 +65,8 @@ protected:
static void _bind_methods();
public:
inline static ResourceUIDScanForUIDOnStartup scan_for_uid_on_startup = nullptr;
String id_to_text(ID p_id) const;
ID text_to_id(const String &p_text) const;

View File

@ -350,16 +350,16 @@ Error Expression::_get_token(Token &r_token) {
case READING_INT: {
if (is_digit(c)) {
if (is_first_char && c == '0') {
if (next_char == 'b') {
if (next_char == 'b' || next_char == 'B') {
reading = READING_BIN;
} else if (next_char == 'x') {
} else if (next_char == 'x' || next_char == 'X') {
reading = READING_HEX;
}
}
} else if (c == '.') {
reading = READING_DEC;
is_float = true;
} else if (c == 'e') {
} else if (c == 'e' || c == 'E') {
reading = READING_EXP;
is_float = true;
} else {
@ -370,7 +370,7 @@ Error Expression::_get_token(Token &r_token) {
case READING_BIN: {
if (bin_beg && !is_binary_digit(c)) {
reading = READING_DONE;
} else if (c == 'b') {
} else if (c == 'b' || c == 'B') {
bin_beg = true;
}
@ -378,14 +378,14 @@ Error Expression::_get_token(Token &r_token) {
case READING_HEX: {
if (hex_beg && !is_hex_digit(c)) {
reading = READING_DONE;
} else if (c == 'x') {
} else if (c == 'x' || c == 'X') {
hex_beg = true;
}
} break;
case READING_DEC: {
if (is_digit(c)) {
} else if (c == 'e') {
} else if (c == 'e' || c == 'E') {
reading = READING_EXP;
} else {
reading = READING_DONE;

View File

@ -117,7 +117,7 @@ constexpr bool is_control(char32_t p_char) {
}
constexpr bool is_whitespace(char32_t p_char) {
return (p_char == ' ') || (p_char == 0x00a0) || (p_char == 0x1680) || (p_char >= 0x2000 && p_char <= 0x200a) || (p_char == 0x202f) || (p_char == 0x205f) || (p_char == 0x3000) || (p_char == 0x2028) || (p_char == 0x2029) || (p_char >= 0x0009 && p_char <= 0x000d) || (p_char == 0x0085);
return (p_char == ' ') || (p_char == 0x00a0) || (p_char == 0x1680) || (p_char >= 0x2000 && p_char <= 0x200b) || (p_char == 0x202f) || (p_char == 0x205f) || (p_char == 0x3000) || (p_char == 0x2028) || (p_char == 0x2029) || (p_char >= 0x0009 && p_char <= 0x000d) || (p_char == 0x0085);
}
constexpr bool is_linebreak(char32_t p_char) {

View File

@ -503,7 +503,7 @@ String TranslationServer::get_tool_locale() {
// Look for best matching loaded translation.
Ref<Translation> t = main_domain->get_translation_object(locale);
if (t.is_null()) {
return "en";
return fallback;
}
return t->get_locale();
}

View File

@ -4964,17 +4964,18 @@ bool String::is_valid_float() const {
bool numbers_found = false;
for (int i = from; i < len; i++) {
if (is_digit(operator[](i))) {
const char32_t c = operator[](i);
if (is_digit(c)) {
if (exponent_found) {
exponent_values_found = true;
} else {
numbers_found = true;
}
} else if (numbers_found && !exponent_found && operator[](i) == 'e') {
} else if (numbers_found && !exponent_found && (c == 'e' || c == 'E')) {
exponent_found = true;
} else if (!period_found && !exponent_found && operator[](i) == '.') {
} else if (!period_found && !exponent_found && c == '.') {
period_found = true;
} else if ((operator[](i) == '-' || operator[](i) == '+') && exponent_found && !exponent_values_found && !sign_found) {
} else if ((c == '-' || c == '+') && exponent_found && !exponent_values_found && !sign_found) {
sign_found = true;
} else {
return false; // no start with number plz

View File

@ -1034,6 +1034,18 @@ struct _VariantCall {
return len;
}
static PackedByteArray func_PackedStringArray_to_byte_array(PackedStringArray *p_instance) {
PackedByteArray ret;
uint64_t size = p_instance->size();
const String *r = p_instance->ptr();
for (uint64_t i = 0; i < size; i++) {
ret.append_array(r[i].to_utf8_buffer());
ret.append(0);
}
return ret;
}
static void func_Callable_call(Variant *v, const Variant **p_args, int p_argcount, Variant &r_ret, Callable::CallError &r_error) {
Callable *callable = VariantGetInternalPtr<Callable>::get_ptr(v);
callable->callp(p_args, p_argcount, r_ret, r_error);
@ -2577,7 +2589,7 @@ static void _register_variant_builtin_methods_array() {
bind_method(PackedStringArray, has, sarray("value"), varray());
bind_method(PackedStringArray, reverse, sarray(), varray());
bind_method(PackedStringArray, slice, sarray("begin", "end"), varray(INT_MAX));
bind_method(PackedStringArray, to_byte_array, sarray(), varray());
bind_function(PackedStringArray, to_byte_array, _VariantCall::func_PackedStringArray_to_byte_array, sarray(), varray());
bind_method(PackedStringArray, sort, sarray(), varray());
bind_method(PackedStringArray, bsearch, sarray("value", "before"), varray(true));
bind_method(PackedStringArray, duplicate, sarray(), varray());

View File

@ -441,7 +441,7 @@ Error VariantParser::get_token(Stream *p_stream, Token &r_token, int &line, Stri
} else if (c == '.') {
reading = READING_DEC;
is_float = true;
} else if (c == 'e') {
} else if (c == 'e' || c == 'E') {
reading = READING_EXP;
is_float = true;
} else {
@ -451,7 +451,7 @@ Error VariantParser::get_token(Stream *p_stream, Token &r_token, int &line, Stri
} break;
case READING_DEC: {
if (is_digit(c)) {
} else if (c == 'e') {
} else if (c == 'e' || c == 'E') {
reading = READING_EXP;
} else {
reading = READING_DONE;
@ -1224,7 +1224,7 @@ Error VariantParser::parse_value(Token &token, Variant &value, Stream *p_stream,
r_err_str = String();
value_type = Variant::OBJECT;
value_class_name = token.value;
got_comma_token = true;
got_bracket_token = true;
} else {
return err;
}
@ -1962,7 +1962,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
case Variant::FLOAT: {
String s = rtos_fix(p_variant.operator double());
if (s != "inf" && s != "inf_neg" && s != "nan") {
if (!s.contains_char('.') && !s.contains_char('e')) {
if (!s.contains_char('.') && !s.contains_char('e') && !s.contains_char('E')) {
s += ".0";
}
}

View File

@ -73,6 +73,25 @@
The sample rate to use (in Hz). Higher values are more demanding for the CPU to generate, but result in better quality.
In games, common sample rates in use are [code]11025[/code], [code]16000[/code], [code]22050[/code], [code]32000[/code], [code]44100[/code], and [code]48000[/code].
According to the [url=https://en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_sampling_theorem]Nyquist-Shannon sampling theorem[/url], there is no quality difference to human hearing when going past 40,000 Hz (since most humans can only hear up to ~20,000 Hz, often less). If you are generating lower-pitched sounds such as voices, lower sample rates such as [code]32000[/code] or [code]22050[/code] may be usable with no loss in quality.
[b]Note:[/b] [AudioStreamGenerator] is not automatically resampling input data, to produce expected result [member mix_rate_mode] should match the sampling rate of input data.
[b]Note:[/b] If you are using [AudioEffectCapture] as the source of your data, set [member mix_rate_mode] to [constant MIX_RATE_INPUT] or [constant MIX_RATE_OUTPUT] to automatically match current [AudioServer] mixing rate.
</member>
<member name="mix_rate_mode" type="int" setter="set_mix_rate_mode" getter="get_mix_rate_mode" enum="AudioStreamGenerator.AudioStreamGeneratorMixRate" default="2">
Mixing rate mode. If set to [constant MIX_RATE_CUSTOM], [member mix_rate] is used, otherwise current [AudioServer] mixing rate is used.
</member>
</members>
<constants>
<constant name="MIX_RATE_OUTPUT" value="0" enum="AudioStreamGeneratorMixRate">
Current [AudioServer] output mixing rate.
</constant>
<constant name="MIX_RATE_INPUT" value="1" enum="AudioStreamGeneratorMixRate">
Current [AudioServer] input mixing rate.
</constant>
<constant name="MIX_RATE_CUSTOM" value="2" enum="AudioStreamGeneratorMixRate">
Custom mixing rate, specified by [member mix_rate].
</constant>
<constant name="MIX_RATE_MAX" value="3" enum="AudioStreamGeneratorMixRate">
Maximum value for the mixing rate mode enum.
</constant>
</constants>
</class>

View File

@ -109,8 +109,9 @@
<param index="5" name="aligned" type="bool" default="true" />
<param index="6" name="antialiased" type="bool" default="false" />
<description>
Draws a dashed line from a 2D point to another, with a given color and width. See also [method draw_multiline] and [method draw_polyline].
Draws a dashed line from a 2D point to another, with a given color and width. See also [method draw_line], [method draw_multiline], and [method draw_polyline].
If [param width] is negative, then a two-point primitives will be drawn instead of a four-point ones. This means that when the CanvasItem is scaled, the line parts will remain thin. If this behavior is not desired, then pass a positive [param width] like [code]1.0[/code].
[param dash] is the length of each dash in pixels, with the gap between each dash being the same length. If [param aligned] is [code]true[/code], the length of the first and last dashes may be shortened or lengthened to allow the line to begin and end at the precise points defined by [param from] and [param to]. Both ends are always symmetrical when [param aligned] is [code]true[/code]. If [param aligned] is [code]false[/code], all dashes will have the same length, but the line may appear incomplete at the end due to the dash length not dividing evenly into the line length. Only full dashes are drawn when [param aligned] is [code]false[/code].
If [param antialiased] is [code]true[/code], half transparent "feathers" will be attached to the boundary, making outlines smooth.
[b]Note:[/b] [param antialiased] is only effective if [param width] is greater than [code]0.0[/code].
</description>
@ -146,7 +147,7 @@
<param index="3" name="width" type="float" default="-1.0" />
<param index="4" name="antialiased" type="bool" default="false" />
<description>
Draws a line from a 2D point to another, with a given color and width. It can be optionally antialiased. See also [method draw_multiline] and [method draw_polyline].
Draws a line from a 2D point to another, with a given color and width. It can be optionally antialiased. See also [method draw_dashed_line], [method draw_multiline], and [method draw_polyline].
If [param width] is negative, then a two-point primitive will be drawn instead of a four-point one. This means that when the CanvasItem is scaled, the line will remain thin. If this behavior is not desired, then pass a positive [param width] like [code]1.0[/code].
</description>
</method>
@ -535,7 +536,7 @@
<description>
Returns [code]true[/code] if the node is present in the [SceneTree], its [member visible] property is [code]true[/code] and all its ancestors are also visible. If any ancestor is hidden, this node will not be visible in the scene tree, and is therefore not drawn (see [method _draw]).
Visibility is checked only in parent nodes that inherit from [CanvasItem], [CanvasLayer], and [Window]. If the parent is of any other type (such as [Node], [AnimationPlayer], or [Node3D]), it is assumed to be visible.
[b]Note:[/b] This method does not take [member visibility_layer] into account, so even if this method returns [code]true[/code] the node might end up not being rendered.
[b]Note:[/b] This method does not take [member visibility_layer] into account, so even if this method returns [code]true[/code], the node might end up not being rendered.
</description>
</method>
<method name="make_canvas_position_local" qualifiers="const">

View File

@ -701,7 +701,7 @@
<method name="is_layout_rtl" qualifiers="const">
<return type="bool" />
<description>
Returns [code]true[/code] if layout is right-to-left.
Returns [code]true[/code] if layout is right-to-left. See also [member layout_direction].
</description>
</method>
<method name="release_focus">
@ -983,7 +983,7 @@
Controls the direction on the vertical axis in which the control should grow if its vertical minimum size is changed to be greater than its current size, as the control always has to be at least the minimum size.
</member>
<member name="layout_direction" type="int" setter="set_layout_direction" getter="get_layout_direction" enum="Control.LayoutDirection" default="0">
Controls layout direction and text writing direction. Right-to-left layouts are necessary for certain languages (e.g. Arabic and Hebrew).
Controls layout direction and text writing direction. Right-to-left layouts are necessary for certain languages (e.g. Arabic and Hebrew). See also [method is_layout_rtl].
</member>
<member name="localize_numeral_system" type="bool" setter="set_localize_numeral_system" getter="is_localizing_numeral_system" default="true">
If [code]true[/code], automatically converts code line numbers, list indices, [SpinBox] and [ProgressBar] values from the Western Arabic (0..9) to the numeral systems used in current locale.
@ -1210,7 +1210,7 @@
[b]Note:[/b] This signal is only emitted on Android or iOS, or on desktop/web platforms when [member ProjectSettings.input_devices/pointing/emulate_touch_from_mouse] is enabled.
</constant>
<constant name="NOTIFICATION_LAYOUT_DIRECTION_CHANGED" value="49">
Sent when control layout direction is changed.
Sent when the control layout direction is changed from LTR or RTL or vice versa. This notification is propagated to child Control nodes as result of a change to [member layout_direction].
</constant>
<constant name="CURSOR_ARROW" value="0" enum="CursorShape">
Show the system's arrow mouse cursor when the user hovers the node. Use with [member mouse_default_cursor_shape].
@ -1372,7 +1372,7 @@
Automatic layout direction, determined from the parent control layout direction.
</constant>
<constant name="LAYOUT_DIRECTION_APPLICATION_LOCALE" value="1" enum="LayoutDirection">
Automatic layout direction, determined from the current locale.
Automatic layout direction, determined from the current locale. Right-to-left layout direction is automatically used for languages that require it such as Arabic and Hebrew., but only if a valid translation file is loaded for the given language. For all other languages (or if no valid translation file is found by Godot), left-to-right layout direction is used. If using [TextServerFallback] ([member ProjectSettings.internationalization/rendering/text_driver]), left-to-right layout direction is always used regardless of the language.
</constant>
<constant name="LAYOUT_DIRECTION_LTR" value="2" enum="LayoutDirection">
Left-to-right layout direction.
@ -1381,7 +1381,7 @@
Right-to-left layout direction.
</constant>
<constant name="LAYOUT_DIRECTION_SYSTEM_LOCALE" value="4" enum="LayoutDirection">
Automatic layout direction, determined from the system locale.
Automatic layout direction, determined from the system locale. Right-to-left layout direction is automatically used for languages that require it such as Arabic and Hebrew, but only if a valid translation file is loaded for the given language.. For all other languages (or if no valid translation file is found by Godot), left-to-right layout direction is used. If using [TextServerFallback] ([member ProjectSettings.internationalization/rendering/text_driver]), left-to-right layout direction is always used regardless of the language.
</constant>
<constant name="LAYOUT_DIRECTION_MAX" value="5" enum="LayoutDirection">
Represents the size of the [enum LayoutDirection] enum.

View File

@ -711,8 +711,28 @@
Port used for file server when exporting project with remote file system.
</member>
<member name="filesystem/import/blender/blender_path" type="String" setter="" getter="">
The path to the directory containing the Blender executable used for converting the Blender 3D scene files [code].blend[/code] to glTF 2.0 format during import. Blender 3.0 or later is required.
The path to the Blender executable used for converting the Blender 3D scene files [code].blend[/code] to glTF 2.0 format during import. Blender 3.0 or later is required.
To enable this feature for your specific project, use [member ProjectSettings.filesystem/import/blender/enabled].
If this setting is empty, Blender's default paths will be detected and used automatically if present in this order:
[b]Windows:[/b]
[codeblock]
- C:\Program Files\Blender Foundation\blender.exe
- C:\Program Files (x86)\Blender Foundation\blender.exe
[/codeblock]
[b]macOS:[/b]
[codeblock]
- /opt/homebrew/bin/blender
- /opt/local/bin/blender
- /usr/local/bin/blender
- /usr/local/opt/blender
- /Applications/Blender.app/Contents/MacOS/Blender
[/codeblock]
[b]Linux/*BSD:[/b]
[codeblock]
- /usr/bin/blender
- /usr/local/bin/blender
- /opt/blender/bin/blender
[/codeblock]
</member>
<member name="filesystem/import/blender/rpc_port" type="int" setter="" getter="">
The port number used for Remote Procedure Call (RPC) communication with Godot's created process of the blender executable.
@ -1134,19 +1154,11 @@
- [b]Auto (based on screen size)[/b] (default) will automatically choose how to launch the Play window based on the device and screen metrics. Defaults to [b]Same as Editor[/b] on phones and [b]Side-by-side with Editor[/b] on tablets.
- [b]Same as Editor[/b] will launch the Play window in the same window as the Editor.
- [b]Side-by-side with Editor[/b] will launch the Play window side-by-side with the Editor window.
- [b]Launch in PiP mode[/b] will launch the Play window directly in picture-in-picture (PiP) mode if PiP mode is supported and enabled. When maximized, the Play window will occupy the same window as the Editor.
[b]Note:[/b] Only available in the Android editor.
</member>
<member name="run/window_placement/game_embed_mode" type="int" setter="" getter="">
Overrides game embedding setting for all newly opened projects. If enabled, game embedding settings are not saved.
</member>
<member name="run/window_placement/play_window_pip_mode" type="int" setter="" getter="">
Specifies the picture-in-picture (PiP) mode for the Play window.
- [b]Disabled:[/b] PiP is disabled for the Play window.
- [b]Enabled:[/b] If the device supports it, PiP is always enabled for the Play window. The Play window will contain a button to enter PiP mode.
- [b]Enabled when Play window is same as Editor[/b] (default for Android editor): If the device supports it, PiP is enabled when the Play window is the same as the Editor. The Play window will contain a button to enter PiP mode.
[b]Note:[/b] Only available in the Android editor.
</member>
<member name="run/window_placement/rect" type="int" setter="" getter="">
The window mode to use to display the project when starting the project from the editor.
[b]Note:[/b] Game embedding is not available for "Force Maximized" or "Force Fullscreen."
@ -1217,6 +1229,9 @@
<member name="text_editor/appearance/whitespace/line_spacing" type="int" setter="" getter="">
The space to add between lines (in pixels). Greater line spacing can help improve readability at the cost of displaying fewer lines on screen.
</member>
<member name="text_editor/behavior/documentation/enable_tooltips" type="bool" setter="" getter="">
If [code]true[/code], documentation tooltips will appear when hovering over a symbol.
</member>
<member name="text_editor/behavior/files/auto_reload_and_parse_scripts_on_save" type="bool" setter="" getter="">
If [code]true[/code], tool scripts will be automatically soft-reloaded after they are saved.
</member>

View File

@ -16,6 +16,7 @@
<param index="0" name="callable" type="Callable" />
<description>
Creates a reference to a [Callable] that can be used as a callback by JavaScript. The reference must be kept until the callback happens, or it won't be called at all. See [JavaScriptObject] for usage.
[b]Note:[/b] The callback function must take exactly one [Array] argument, which is going to be the JavaScript [url=https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments]arguments object[/url] converted to an array.
</description>
</method>
<method name="create_object" qualifiers="vararg">

View File

@ -117,6 +117,8 @@
<return type="bool" />
<description>
Returns [code]true[/code] if the node is present in the [SceneTree], its [member visible] property is [code]true[/code] and all its ancestors are also visible. If any ancestor is hidden, this node will not be visible in the scene tree.
Visibility is checked only in parent nodes that inherit from [Node3D]. If the parent is of any other type (such as [Node], [AnimationPlayer], or [Node2D]), it is assumed to be visible.
[b]Note:[/b] This method does not take [member VisualInstance3D.layers] into account, so even if this method returns [code]true[/code], the node might end up not being rendered.
</description>
</method>
<method name="look_at">

View File

@ -193,7 +193,7 @@
<method name="to_byte_array" qualifiers="const">
<return type="PackedByteArray" />
<description>
Returns a [PackedByteArray] with each string encoded as bytes.
Returns a [PackedByteArray] with each string encoded as UTF-8. Strings are [code]null[/code] terminated.
</description>
</method>
</methods>

View File

@ -386,7 +386,9 @@
[b]Note:[/b] If the operating system blocks access to audio input devices (due to the user's privacy settings), audio capture will only return silence. On Windows 10 and later, make sure that apps are allowed to access the microphone in the OS' privacy settings.
</member>
<member name="audio/driver/mix_rate" type="int" setter="" getter="" default="44100">
The mixing rate used for audio (in Hz). In general, it's better to not touch this and leave it to the host operating system.
Target mixing rate used for audio (in Hz). In general, it's better to not touch this and leave it to the host operating system.
[b]Note:[/b] On iOS and macOS, mixing rate is determined by audio driver, this value is ignored.
[b]Note:[/b] Input and output mixing rates might be different. Use [method AudioServer.get_mix_rate] and [method AudioServer.get_input_mix_rate] to get actual values.
</member>
<member name="audio/driver/mix_rate.web" type="int" setter="" getter="" default="0">
Safer override for [member audio/driver/mix_rate] in the Web platform. Here [code]0[/code] means "let the browser choose" (since some browsers do not like forcing the mix rate).
@ -1460,14 +1462,16 @@
</member>
<member name="internationalization/locale/fallback" type="String" setter="" getter="" default="&quot;en&quot;">
The locale to fall back to if a translation isn't available in a given language. If left empty, [code]en[/code] (English) will be used.
[b]Note:[/b] Not to be confused with [TextServerFallback].
</member>
<member name="internationalization/locale/include_text_server_data" type="bool" setter="" getter="" default="false">
If [code]true[/code], text server break iteration rule sets, dictionaries and other optional data are included in the exported project.
[b]Note:[/b] "ICU / HarfBuzz / Graphite" text server data includes dictionaries for Burmese, Chinese, Japanese, Khmer, Lao and Thai as well as Unicode Standard Annex #29 and Unicode Standard Annex #14 word and line breaking rules. Data is about 4 MB large.
[b]Note:[/b] "Fallback" text server does not use additional data.
[b]Note:[/b] [TextServerFallback] does not use additional data.
</member>
<member name="internationalization/locale/test" type="String" setter="" getter="" default="&quot;&quot;">
If non-empty, this locale will be used when running the project from the editor.
If non-empty, this locale will be used instead of the automatically detected system locale.
[b]Note:[/b] This setting also applies to the exported project. To only affect testing within the editor, override this setting with an [code]editor[/code] [url=$DOCS_URL/tutorials/export/feature_tags.html]feature tag[/url] for localization testing purposes.
</member>
<member name="internationalization/pseudolocalization/double_vowels" type="bool" setter="" getter="" default="false">
Double vowels in strings during pseudolocalization to simulate the lengthening of text due to localization.
@ -1509,7 +1513,7 @@
</member>
<member name="internationalization/rendering/text_driver" type="String" setter="" getter="" default="&quot;&quot;">
Specifies the [TextServer] to use. If left empty, the default will be used.
"ICU / HarfBuzz / Graphite" is the most advanced text driver, supporting right-to-left typesetting and complex scripts (for languages like Arabic, Hebrew, etc.). The "Fallback" text driver does not support right-to-left typesetting and complex scripts.
"ICU / HarfBuzz / Graphite" ([TextServerAdvanced]) is the most advanced text driver, supporting right-to-left typesetting and complex scripts (for languages like Arabic, Hebrew, etc.). The "Fallback" text driver ([TextServerFallback]) does not support right-to-left typesetting and complex scripts.
[b]Note:[/b] The driver in use can be overridden at runtime via the [code]--text-driver[/code] [url=$DOCS_URL/tutorials/editor/command_line_tutorial.html]command line argument[/url].
[b]Note:[/b] There is an additional [code]Dummy[/code] text driver available, which disables all text rendering and font-related functionality. This driver is not listed in the project settings, but it can be enabled when running the editor or project using the [code]--text-driver Dummy[/code] [url=$DOCS_URL/tutorials/editor/command_line_tutorial.html]command line argument[/url].
</member>
@ -2328,6 +2332,7 @@
</member>
<member name="physics/3d/run_on_separate_thread" type="bool" setter="" getter="" default="false">
If [code]true[/code], the 3D physics server runs on a separate thread, making better use of multi-core CPUs. If [code]false[/code], the 3D physics server runs on the main thread. Running the physics server on a separate thread can increase performance, but restricts API access to only physics process.
[b]Note:[/b] When [member physics/3d/physics_engine] is set to [code]Jolt Physics[/code], enabling this setting will prevent the 3D physics server from being able to provide any context when reporting errors and warnings, and will instead always refer to nodes as [code]&lt;unknown&gt;[/code].
</member>
<member name="physics/3d/sleep_threshold_angular" type="float" setter="" getter="" default="0.139626">
Threshold angular velocity under which a 3D physics body will be considered inactive. See [constant PhysicsServer3D.SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_THRESHOLD].
@ -2735,17 +2740,21 @@
The VoxelGI quality to use. High quality leads to more precise lighting and better reflections, but is slower to render. This setting does not affect the baked data and doesn't require baking the [VoxelGI] again to apply.
[b]Note:[/b] This property is only read when the project starts. To control VoxelGI quality at runtime, call [method RenderingServer.voxel_gi_set_quality] instead.
</member>
<member name="rendering/lightmapping/bake_performance/max_rays_per_pass" type="int" setter="" getter="" default="32">
<member name="rendering/lightmapping/bake_performance/max_rays_per_pass" type="int" setter="" getter="" default="4">
The maximum number of rays that can be thrown per pass when baking lightmaps with [LightmapGI]. Depending on the scene, adjusting this value may result in higher GPU utilization when baking lightmaps, leading to faster bake times.
[b]Note:[/b] Using a value that is too high for your system can cause crashes due to the GPU being unresponsive for long periods of time, and the graphics driver being reset by the OS.
</member>
<member name="rendering/lightmapping/bake_performance/max_rays_per_probe_pass" type="int" setter="" getter="" default="64">
The maximum number of rays that can be thrown per pass when baking dynamic object lighting in [LightmapProbe]s with [LightmapGI]. Depending on the scene, adjusting this value may result in higher GPU utilization when baking lightmaps, leading to faster bake times.
[b]Note:[/b] Using a value that is too high for your system can cause crashes due to the GPU being unresponsive for long periods of time, and the graphics driver being reset by the OS.
</member>
<member name="rendering/lightmapping/bake_performance/max_transparency_rays" type="int" setter="" getter="" default="8">
The maximum number of retry rays that can be thrown per pass when hitting a transparent surface when baking lightmaps with [LightmapGI]. Depending on the scene, reducing this value may lead to faster bake times.
[b]Note:[/b] Using a value that is too high for your system can cause crashes due to the GPU being unresponsive for long periods of time, and the graphics driver being reset by the OS.
</member>
<member name="rendering/lightmapping/bake_performance/region_size" type="int" setter="" getter="" default="512">
The region size to use when baking lightmaps with [LightmapGI].
The region size to use when baking lightmaps with [LightmapGI]. The specified value is rounded up to the nearest power of 2.
[b]Note:[/b] Using a value that is too high for your system can cause crashes due to the GPU being unresponsive for long periods of time, and the graphics driver being reset by the OS.
</member>
<member name="rendering/lightmapping/bake_quality/high_quality_probe_ray_count" type="int" setter="" getter="" default="512">
The number of rays to use for baking dynamic object lighting in [LightmapProbe]s when [member LightmapGI.quality] is [constant LightmapGI.BAKE_QUALITY_HIGH].
@ -2978,8 +2987,8 @@
[b]Note:[/b] This setting is implemented only on Windows, Android, macOS, iOS, and Linux/X11.
</member>
<member name="rendering/rendering_device/fallback_to_vulkan" type="bool" setter="" getter="" default="true">
If [code]true[/code], the forward renderer will fall back to Vulkan if Direct3D 12 is not supported.
[b]Note:[/b] This setting is implemented only on Windows.
If [code]true[/code], the forward renderer will fall back to Vulkan if Direct3D 12 (on Windows) or Metal (on macOS x86_64) are not supported.
[b]Note:[/b] This setting is implemented only on Windows and macOS.
</member>
<member name="rendering/rendering_device/pipeline_cache/enable" type="bool" setter="" getter="" default="true">
Enable the pipeline cache that is saved to disk if the graphics API supports it.

View File

@ -349,9 +349,12 @@
<method name="get_line_column_at_pos" qualifiers="const">
<return type="Vector2i" />
<param index="0" name="position" type="Vector2i" />
<param index="1" name="allow_out_of_bounds" type="bool" default="true" />
<param index="1" name="clamp_line" type="bool" default="true" />
<param index="2" name="clamp_column" type="bool" default="true" />
<description>
Returns the line and column at the given position. In the returned vector, [code]x[/code] is the column, [code]y[/code] is the line. If [param allow_out_of_bounds] is [code]false[/code] and the position is not over the text, both vector values will be set to [code]-1[/code].
Returns the line and column at the given position. In the returned vector, [code]x[/code] is the column and [code]y[/code] is the line.
If [param clamp_line] is [code]false[/code] and [param position] is below the last line, [code]Vector2i(-1, -1)[/code] is returned.
If [param clamp_column] is [code]false[/code] and [param position] is outside the column range of the line, [code]Vector2i(-1, -1)[/code] is returned.
</description>
</method>
<method name="get_line_count" qualifiers="const">
@ -416,6 +419,13 @@
Returns the width in pixels of the [param wrap_index] on [param line].
</description>
</method>
<method name="get_line_with_ime" qualifiers="const">
<return type="String" />
<param index="0" name="line" type="int" />
<description>
Returns line text as it is currently displayed, including IME composition string.
</description>
</method>
<method name="get_line_wrap_count" qualifiers="const">
<return type="int" />
<param index="0" name="line" type="int" />

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

158882
doc/translations/ta.po Normal file

File diff suppressed because it is too large Load Diff

163007
doc/translations/uk.po Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -713,7 +713,14 @@ void main() {
#endif
#ifdef RENDER_MATERIAL
gl_Position.xy = (uv2_attrib.xy + uv_offset) * 2.0 - 1.0;
vec2 uv_dest_attrib;
if (uv_scale != vec4(0.0)) {
uv_dest_attrib = (uv2_attrib.xy - 0.5) * uv_scale.zw;
} else {
uv_dest_attrib = uv2_attrib.xy;
}
gl_Position.xy = (uv_dest_attrib + uv_offset) * 2.0 - 1.0;
gl_Position.z = 0.00001;
gl_Position.w = 1.0;
#endif

View File

@ -93,6 +93,7 @@ struct API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0)) MetalFeatures {
bool needs_arg_encoders = true;
bool metal_fx_spatial = false; /**< If true, Metal FX spatial functions are supported. */
bool metal_fx_temporal = false; /**< If true, Metal FX temporal functions are supported. */
bool supports_gpu_address = false; /**< If true, referencing a GPU address in a shader is supported. */
};
struct MetalLimits {

View File

@ -99,6 +99,10 @@ void MetalDeviceProperties::init_features(id<MTLDevice> p_device) {
features.supports32BitMSAA = p_device.supports32BitMSAA;
}
if (@available(macOS 13.0, iOS 16.0, tvOS 16.0, *)) {
features.supports_gpu_address = true;
}
features.hostMemoryPageSize = sysconf(_SC_PAGESIZE);
for (SampleCount sc = SampleCount1; sc <= SampleCount64; sc <<= 1) {

View File

@ -65,7 +65,6 @@
#import <zlib.h>
#import <initializer_list>
#import <optional>
#import <spirv.hpp>
// These types can be used in Vector and other containers that use
// pointer operations not supported by ARC.
@ -563,7 +562,7 @@ struct API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0)) BindingInfo {
MTLBindingAccess access = MTLBindingAccessReadOnly;
MTLResourceUsage usage = 0;
MTLTextureType textureType = MTLTextureType2D;
spv::ImageFormat imageFormat = spv::ImageFormatUnknown;
int imageFormat = 0;
uint32_t arrayLength = 0;
bool isMultisampled = false;

View File

@ -164,6 +164,9 @@ uint64_t RenderingDeviceDriverMetal::buffer_get_device_address(BufferID p_buffer
id<MTLBuffer> obj = rid::get(p_buffer);
return obj.gpuAddress;
} else {
#if DEV_ENABLED
WARN_PRINT_ONCE("buffer_get_device_address is not supported on this OS version.");
#endif
return 0;
}
}
@ -355,7 +358,7 @@ RDD::TextureID RenderingDeviceDriverMetal::texture_create(const TextureFormat &p
// Check if it is a linear format for atomic operations and therefore needs a buffer,
// as generally Metal does not support atomic operations on textures.
bool needs_buffer = is_linear || (p_format.array_layers == 1 && p_format.mipmaps == 1 && p_format.texture_type == TEXTURE_TYPE_2D && flags::any(p_format.usage_bits, TEXTURE_USAGE_STORAGE_BIT) && (p_format.format == DATA_FORMAT_R32_UINT || p_format.format == DATA_FORMAT_R32_SINT));
bool needs_buffer = is_linear || (p_format.array_layers == 1 && p_format.mipmaps == 1 && p_format.texture_type == TEXTURE_TYPE_2D && flags::any(p_format.usage_bits, TEXTURE_USAGE_STORAGE_BIT) && (p_format.format == DATA_FORMAT_R32_UINT || p_format.format == DATA_FORMAT_R32_SINT || p_format.format == DATA_FORMAT_R32G32_UINT || p_format.format == DATA_FORMAT_R32G32_SINT));
id<MTLTexture> obj = nil;
if (needs_buffer) {
@ -2033,10 +2036,6 @@ Vector<uint8_t> RenderingDeviceDriverMetal::shader_compile_binary_from_spirv(Vec
CompilerMSL::Options msl_options{};
msl_options.set_msl_version(version_major, version_minor);
if (version_major == 3 && version_minor >= 1) {
// TODO(sgc): Restrict to Metal 3.0 for now, until bugs in SPIRV-cross image atomics are resolved.
msl_options.set_msl_version(3, 0);
}
bin_data.msl_version = msl_options.msl_version;
#if TARGET_OS_OSX
msl_options.platform = CompilerMSL::Options::macOS;
@ -2063,9 +2062,9 @@ Vector<uint8_t> RenderingDeviceDriverMetal::shader_compile_binary_from_spirv(Vec
msl_options.argument_buffers = false;
bin_data.set_uses_argument_buffers(false);
}
msl_options.force_active_argument_buffer_resources = true; // Same as MoltenVK when using argument buffers.
// msl_options.pad_argument_buffer_resources = true; // Same as MoltenVK when using argument buffers.
msl_options.force_active_argument_buffer_resources = true;
// We can't use this, as we have to add the descriptor sets via compiler.add_msl_resource_binding.
// msl_options.pad_argument_buffer_resources = true;
msl_options.texture_buffer_native = true; // Enable texture buffer support.
msl_options.use_framebuffer_fetch_subpasses = false;
msl_options.pad_fragment_output_components = true;
@ -4036,7 +4035,7 @@ bool RenderingDeviceDriverMetal::has_feature(Features p_feature) {
case SUPPORTS_FRAGMENT_SHADER_WITH_ONLY_SIDE_EFFECTS:
return true;
case SUPPORTS_BUFFER_DEVICE_ADDRESS:
return false;
return device_properties->features.supports_gpu_address;
case SUPPORTS_METALFX_SPATIAL:
return device_properties->features.metal_fx_spatial;
case SUPPORTS_METALFX_TEMPORAL:

View File

@ -434,7 +434,7 @@ Error DirAccessUnix::remove(String p_path) {
}
struct stat flags = {};
if ((stat(p_path.utf8().get_data(), &flags) != 0)) {
if ((lstat(p_path.utf8().get_data(), &flags) != 0)) {
return FAILED;
}

View File

@ -570,6 +570,7 @@ ActionMapEditor::ActionMapEditor() {
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->set_keep_editing_on_text_submit(true);
add_edit->connect(SceneStringName(text_changed), callable_mp(this, &ActionMapEditor::_add_edit_text_changed));
add_edit->connect(SceneStringName(text_submitted), callable_mp(this, &ActionMapEditor::_add_action));
add_hbox->add_child(add_edit);

View File

@ -145,7 +145,7 @@ void FindReplaceBar::_notification(int p_what) {
} break;
case NOTIFICATION_VISIBILITY_CHANGED: {
set_process_unhandled_input(is_visible_in_tree());
set_process_input(is_visible_in_tree());
} break;
case NOTIFICATION_THEME_CHANGED: {
@ -161,11 +161,11 @@ void FindReplaceBar::_notification(int p_what) {
}
}
void FindReplaceBar::unhandled_input(const Ref<InputEvent> &p_event) {
// Implemented in input(..) as the LineEdit consumes the Escape pressed key.
void FindReplaceBar::input(const Ref<InputEvent> &p_event) {
ERR_FAIL_COND(p_event.is_null());
Ref<InputEventKey> k = p_event;
if (k.is_valid() && k->is_action_pressed(SNAME("ui_cancel"), false, true)) {
Control *focus_owner = get_viewport()->gui_get_focus_owner();
@ -176,13 +176,6 @@ void FindReplaceBar::unhandled_input(const Ref<InputEvent> &p_event) {
}
}
void FindReplaceBar::_focus_lost() {
if (Input::get_singleton()->is_action_pressed(SNAME("ui_cancel"))) {
// Unfocused after pressing Escape, so hide the bar.
_hide_bar(true);
}
}
void FindReplaceBar::_update_flags(bool p_direction_backwards) {
flags = 0;
@ -564,8 +557,8 @@ bool FindReplaceBar::search_next() {
return _search(flags, line, col);
}
void FindReplaceBar::_hide_bar(bool p_force_focus) {
if (replace_text->has_focus() || search_text->has_focus() || p_force_focus) {
void FindReplaceBar::_hide_bar() {
if (replace_text->has_focus() || search_text->has_focus()) {
text_editor->grab_focus();
}
@ -789,7 +782,6 @@ FindReplaceBar::FindReplaceBar() {
search_text->set_custom_minimum_size(Size2(100 * EDSCALE, 0));
search_text->connect(SceneStringName(text_changed), callable_mp(this, &FindReplaceBar::_search_text_changed));
search_text->connect(SceneStringName(text_submitted), callable_mp(this, &FindReplaceBar::_search_text_submitted));
search_text->connect(SceneStringName(focus_exited), callable_mp(this, &FindReplaceBar::_focus_lost));
matches_label = memnew(Label);
hbc_button_search->add_child(matches_label);
@ -828,7 +820,6 @@ FindReplaceBar::FindReplaceBar() {
replace_text->set_tooltip_text(TTR("Replace"));
replace_text->set_custom_minimum_size(Size2(100 * EDSCALE, 0));
replace_text->connect(SceneStringName(text_submitted), callable_mp(this, &FindReplaceBar::_replace_text_submitted));
replace_text->connect(SceneStringName(focus_exited), callable_mp(this, &FindReplaceBar::_focus_lost));
replace = memnew(Button);
hbc_button_replace->add_child(replace);
@ -850,7 +841,7 @@ FindReplaceBar::FindReplaceBar() {
add_child(hide_button);
hide_button->set_tooltip_text(TTR("Hide"));
hide_button->set_focus_mode(FOCUS_NONE);
hide_button->connect(SceneStringName(pressed), callable_mp(this, &FindReplaceBar::_hide_bar).bind(false));
hide_button->connect(SceneStringName(pressed), callable_mp(this, &FindReplaceBar::_hide_bar));
hide_button->set_v_size_flags(SIZE_SHRINK_CENTER);
}

View File

@ -104,12 +104,14 @@ class FindReplaceBar : public HBoxContainer {
bool replace_all_mode = false;
bool preserve_cursor = false;
virtual void input(const Ref<InputEvent> &p_event) override;
void _get_search_from(int &r_line, int &r_col, SearchMode p_search_mode);
void _update_results_count();
void _update_matches_display();
void _show_search(bool p_with_replace, bool p_show_only);
void _hide_bar(bool p_force_focus = false);
void _hide_bar();
void _update_toggle_replace_button(bool p_replace_visible);
void _editor_text_changed();
@ -121,8 +123,6 @@ class FindReplaceBar : public HBoxContainer {
protected:
void _notification(int p_what);
virtual void unhandled_input(const Ref<InputEvent> &p_event) override;
void _focus_lost();
void _update_flags(bool p_direction_backwards);

View File

@ -543,7 +543,7 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, uint64_t p_thread
time_vals.push_back(oe.sec);
time_vals.push_back(oe.msec);
bool e;
String time = String("%d:%02d:%02d:%04d").sprintf(time_vals, &e);
String time = String("%d:%02d:%02d:%03d").sprintf(time_vals, &e);
// Rest of the error data.
bool source_is_project_file = oe.source_file.begins_with("res://");

View File

@ -207,6 +207,7 @@ void EditorCommandPalette::open_popup() {
if (was_showed) {
popup(prev_rect);
} else {
_update_command_search(String());
popup_centered_clamped(Size2(600, 440) * EDSCALE, 0.8f);
}

View File

@ -1023,7 +1023,7 @@ String EditorData::script_class_get_icon_path(const String &p_class, bool *r_val
return String();
}
HashMap<StringName, String>::ConstIterator E = _script_class_icon_paths.find(current);
if ((bool)E) {
if ((bool)E && !E->value.is_empty()) {
if (r_valid) {
*r_valid = true;
}

View File

@ -48,6 +48,9 @@
#include "scene/resources/packed_scene.h"
EditorFileSystem *EditorFileSystem::singleton = nullptr;
int EditorFileSystem::nb_files_total = 0;
EditorFileSystem::ScannedDirectory *EditorFileSystem::first_scan_root_dir = nullptr;
//the name is the version, to keep compatibility with different versions of Godot
#define CACHE_FILE_NAME "filesystem_cache10"
@ -237,16 +240,72 @@ EditorFileSystem::ScannedDirectory::~ScannedDirectory() {
}
}
void EditorFileSystem::_first_scan_filesystem() {
EditorProgress ep = EditorProgress("first_scan_filesystem", TTR("Project initialization"), 5);
void EditorFileSystem::_load_first_scan_root_dir() {
Ref<DirAccess> d = DirAccess::create(DirAccess::ACCESS_RESOURCES);
first_scan_root_dir = memnew(ScannedDirectory);
first_scan_root_dir->full_path = "res://";
nb_files_total = _scan_new_dir(first_scan_root_dir, d);
}
void EditorFileSystem::scan_for_uid() {
// Load file structure into memory.
_load_first_scan_root_dir();
// Load extensions for which an .import should exists.
List<String> extensionsl;
HashSet<String> import_extensions;
ResourceFormatImporter::get_singleton()->get_recognized_extensions(&extensionsl);
for (const String &E : extensionsl) {
import_extensions.insert(E);
}
// Scan the file system to load uid.
_scan_for_uid_directory(first_scan_root_dir, import_extensions);
// It's done, resetting the callback method to prevent a second scan.
ResourceUID::scan_for_uid_on_startup = nullptr;
}
void EditorFileSystem::_scan_for_uid_directory(const ScannedDirectory *p_scan_dir, const HashSet<String> &p_import_extensions) {
for (ScannedDirectory *scan_sub_dir : p_scan_dir->subdirs) {
_scan_for_uid_directory(scan_sub_dir, p_import_extensions);
}
for (const String &scan_file : p_scan_dir->files) {
const String ext = scan_file.get_extension().to_lower();
if (ext == "uid" || ext == "import") {
continue;
}
const String path = p_scan_dir->full_path.path_join(scan_file);
ResourceUID::ID uid = ResourceUID::INVALID_ID;
if (p_import_extensions.has(ext)) {
if (FileAccess::exists(path + ".import")) {
uid = ResourceFormatImporter::get_singleton()->get_resource_uid(path);
}
} else {
uid = ResourceLoader::get_resource_uid(path);
}
if (uid != ResourceUID::INVALID_ID) {
if (!ResourceUID::get_singleton()->has_id(uid)) {
ResourceUID::get_singleton()->add_id(uid, path);
}
}
}
}
void EditorFileSystem::_first_scan_filesystem() {
EditorProgress ep = EditorProgress("first_scan_filesystem", TTR("Project initialization"), 5);
HashSet<String> existing_class_names;
HashSet<String> extensions;
ep.step(TTR("Scanning file structure..."), 0, true);
nb_files_total = _scan_new_dir(first_scan_root_dir, d);
if (!first_scan_root_dir) {
ep.step(TTR("Scanning file structure..."), 0, true);
_load_first_scan_root_dir();
}
// Preloading GDExtensions file extensions to prevent looping on all the resource loaders
// for each files in _first_scan_process_scripts.
@ -440,6 +499,7 @@ void EditorFileSystem::_scan_filesystem() {
sd = first_scan_root_dir;
// Will be updated on scan.
ResourceUID::get_singleton()->clear();
ResourceUID::scan_for_uid_on_startup = nullptr;
processed_files = memnew(HashSet<String>());
} else {
Ref<DirAccess> d = DirAccess::create(DirAccess::ACCESS_RESOURCES);
@ -1263,7 +1323,7 @@ void EditorFileSystem::_process_file_system(const ScannedDirectory *p_scan_dir,
}
}
if (ResourceLoader::exists(path) && !ResourceLoader::has_custom_uid_support(path) && !FileAccess::exists(path + ".uid")) {
if (ResourceLoader::should_create_uid_file(path)) {
// Create a UID file and new UID, if it's invalid.
Ref<FileAccess> f = FileAccess::open(path + ".uid", FileAccess::WRITE);
if (f.is_valid()) {
@ -1888,6 +1948,16 @@ EditorFileSystemDirectory *EditorFileSystem::find_file(const String &p_file, int
return fs;
}
ResourceUID::ID EditorFileSystem::get_file_uid(const String &p_path) const {
int file_idx;
EditorFileSystemDirectory *directory = find_file(p_path, &file_idx);
if (!directory) {
return ResourceUID::INVALID_ID;
}
return directory->files[file_idx]->uid;
}
EditorFileSystemDirectory *EditorFileSystem::get_filesystem_path(const String &p_path) {
if (!filesystem || scanning) {
return nullptr;
@ -2345,7 +2415,7 @@ void EditorFileSystem::update_files(const Vector<String> &p_script_paths) {
ResourceUID::get_singleton()->update_cache();
} else {
if (ResourceLoader::exists(file) && !ResourceLoader::has_custom_uid_support(file) && !FileAccess::exists(file + ".uid")) {
if (ResourceLoader::should_create_uid_file(file)) {
Ref<FileAccess> f = FileAccess::open(file + ".uid", FileAccess::WRITE);
if (f.is_valid()) {
const ResourceUID::ID id = ResourceUID::get_singleton()->create_id();

View File

@ -182,7 +182,7 @@ class EditorFileSystem : public Node {
static void _thread_func(void *_userdata);
EditorFileSystemDirectory *new_filesystem = nullptr;
ScannedDirectory *first_scan_root_dir = nullptr;
static ScannedDirectory *first_scan_root_dir;
bool filesystem_changed_queued = false;
bool scanning = false;
@ -192,13 +192,17 @@ class EditorFileSystem : public Node {
float scan_total;
String filesystem_settings_version_for_import;
bool revalidate_import_files = false;
int nb_files_total = 0;
static int nb_files_total;
void _notify_filesystem_changed();
void _scan_filesystem();
void _first_scan_filesystem();
void _first_scan_process_scripts(const ScannedDirectory *p_scan_dir, List<String> &p_gdextension_extensions, HashSet<String> &p_existing_class_names, HashSet<String> &p_extensions);
static void _scan_for_uid_directory(const ScannedDirectory *p_scan_dir, const HashSet<String> &p_import_extensions);
static void _load_first_scan_root_dir();
HashSet<String> late_update_files;
void _save_late_updated_files();
@ -255,7 +259,7 @@ class EditorFileSystem : public Node {
HashSet<String> valid_extensions;
HashSet<String> import_extensions;
int _scan_new_dir(ScannedDirectory *p_dir, Ref<DirAccess> &da);
static int _scan_new_dir(ScannedDirectory *p_dir, Ref<DirAccess> &da);
void _process_file_system(const ScannedDirectory *p_scan_dir, EditorFileSystemDirectory *p_dir, ScanProgress &p_progress, HashSet<String> *p_processed_files);
Thread thread_sources;
@ -397,6 +401,7 @@ public:
EditorFileSystemDirectory *get_filesystem_path(const String &p_path);
String get_file_type(const String &p_file) const;
EditorFileSystemDirectory *find_file(const String &p_file, int *r_index) const;
ResourceUID::ID get_file_uid(const String &p_path) const;
void reimport_files(const Vector<String> &p_files);
Error reimport_append(const String &p_file, const HashMap<StringName, Variant> &p_custom_options, const String &p_custom_importer, Variant p_generator_parameters);
@ -412,6 +417,8 @@ public:
static bool _should_skip_directory(const String &p_path);
static void scan_for_uid();
void add_import_format_support_query(Ref<EditorFileSystemImportFormatSupportQuery> p_query);
void remove_import_format_support_query(Ref<EditorFileSystemImportFormatSupportQuery> p_query);
EditorFileSystem();

View File

@ -4581,6 +4581,7 @@ EditorHelpHighlighter::~EditorHelpHighlighter() {
FindBar::FindBar() {
search_text = memnew(LineEdit);
add_child(search_text);
search_text->set_keep_editing_on_text_submit(true);
search_text->set_custom_minimum_size(Size2(100 * EDSCALE, 0));
search_text->set_h_size_flags(SIZE_EXPAND_FILL);
search_text->connect(SceneStringName(text_changed), callable_mp(this, &FindBar::_search_text_changed));
@ -4644,7 +4645,7 @@ void FindBar::_notification(int p_what) {
} break;
case NOTIFICATION_VISIBILITY_CHANGED: {
set_process_unhandled_input(is_visible_in_tree());
set_process_input(is_visible_in_tree());
} break;
}
}
@ -4721,12 +4722,15 @@ void FindBar::_hide_bar() {
hide();
}
void FindBar::unhandled_input(const Ref<InputEvent> &p_event) {
// Implemented in input(..) as the LineEdit consumes the Escape pressed key.
void FindBar::input(const Ref<InputEvent> &p_event) {
ERR_FAIL_COND(p_event.is_null());
Ref<InputEventKey> k = p_event;
if (k.is_valid() && k->is_action_pressed(SNAME("ui_cancel"), false, true)) {
if (rich_text_label->has_focus() || is_ancestor_of(get_viewport()->gui_get_focus_owner())) {
Control *focus_owner = get_viewport()->gui_get_focus_owner();
if (rich_text_label->has_focus() || (focus_owner && is_ancestor_of(focus_owner))) {
_hide_bar();
accept_event();
}

View File

@ -57,6 +57,8 @@ class FindBar : public HBoxContainer {
int results_count = 0;
virtual void input(const Ref<InputEvent> &p_event) override;
void _hide_bar();
void _search_text_changed(const String &p_text);
@ -67,7 +69,6 @@ class FindBar : public HBoxContainer {
protected:
void _notification(int p_what);
virtual void unhandled_input(const Ref<InputEvent> &p_event) override;
bool _search(bool p_search_previous = false);

View File

@ -228,6 +228,11 @@ EditorPlugin *EditorMainScreen::get_selected_plugin() const {
return selected_plugin;
}
EditorPlugin *EditorMainScreen::get_plugin_by_name(const String &p_plugin_name) const {
ERR_FAIL_COND_V(!main_editor_plugins.has(p_plugin_name), nullptr);
return main_editor_plugins[p_plugin_name];
}
VBoxContainer *EditorMainScreen::get_control() const {
return main_screen_vbox;
}
@ -254,6 +259,7 @@ void EditorMainScreen::add_main_plugin(EditorPlugin *p_editor) {
buttons.push_back(tb);
button_hb->add_child(tb);
editor_table.push_back(p_editor);
main_editor_plugins.insert(p_editor->get_plugin_name(), p_editor);
}
void EditorMainScreen::remove_main_plugin(EditorPlugin *p_editor) {
@ -280,6 +286,7 @@ void EditorMainScreen::remove_main_plugin(EditorPlugin *p_editor) {
}
editor_table.erase(p_editor);
main_editor_plugins.erase(p_editor->get_plugin_name());
}
EditorMainScreen::EditorMainScreen() {

View File

@ -58,6 +58,7 @@ private:
HBoxContainer *button_hb = nullptr;
Vector<Button *> buttons;
Vector<EditorPlugin *> editor_table;
HashMap<String, EditorPlugin *> main_editor_plugins;
int _get_current_main_editor() const;
@ -80,6 +81,7 @@ public:
int get_selected_index() const;
int get_plugin_index(EditorPlugin *p_editor) const;
EditorPlugin *get_selected_plugin() const;
EditorPlugin *get_plugin_by_name(const String &p_plugin_name) const;
VBoxContainer *get_control() const;

View File

@ -3710,7 +3710,9 @@ void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled,
// Only try to load the script if it has a name. Else, the plugin has no init script.
if (script_path.length() > 0) {
script_path = addon_path.get_base_dir().path_join(script_path);
scr = ResourceLoader::load(script_path, "Script", ResourceFormatLoader::CACHE_MODE_IGNORE);
// We should not use the cached version on startup to prevent a script reload
// if it is already loaded and potentially running from autoloads. See GH-100750.
scr = ResourceLoader::load(script_path, "Script", EditorFileSystem::get_singleton()->doing_first_scan() ? ResourceFormatLoader::CACHE_MODE_REUSE : ResourceFormatLoader::CACHE_MODE_IGNORE);
if (scr.is_null()) {
show_warning(vformat(TTR("Unable to load addon script from path: '%s'."), script_path));
@ -4941,7 +4943,7 @@ Ref<Texture2D> EditorNode::get_class_icon(const String &p_class, const String &p
String script_path;
if (ScriptServer::is_global_class(p_class)) {
script_path = ScriptServer::get_global_class_path(p_class);
} else if (ResourceLoader::exists(p_class)) { // If the script is not a class_name we check if the script resource exists.
} else if (!p_class.get_extension().is_empty() && ResourceLoader::exists(p_class)) { // If the script is not a class_name we check if the script resource exists.
script_path = p_class;
}
@ -5734,7 +5736,9 @@ void EditorNode::_cancel_close_scene_tab() {
}
void EditorNode::_prepare_save_confirmation_popup() {
save_confirmation->reparent(get_last_exclusive_window());
if (save_confirmation->get_window() != get_last_exclusive_window()) {
save_confirmation->reparent(get_last_exclusive_window());
}
}
void EditorNode::_toggle_distraction_free_mode() {

View File

@ -1825,6 +1825,7 @@ void EditorPropertyRect2i::setup(int p_min, int p_max, const String &p_suffix) {
spin[i]->set_allow_greater(true);
spin[i]->set_allow_lesser(true);
spin[i]->set_suffix(p_suffix);
spin[i]->set_editing_integer(true);
}
}
@ -3663,7 +3664,7 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_
case Variant::VECTOR2I: {
EditorPropertyVector2i *editor = memnew(EditorPropertyVector2i(p_wide));
EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1, true);
editor->setup(hint.min, hint.max, 1, false, p_hint == PROPERTY_HINT_LINK, hint.suffix);
editor->setup(hint.min, hint.max, 1, false, p_hint == PROPERTY_HINT_LINK, hint.suffix, false, true);
return editor;
} break;
@ -3690,7 +3691,7 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_
case Variant::VECTOR3I: {
EditorPropertyVector3i *editor = memnew(EditorPropertyVector3i(p_wide));
EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1, true);
editor->setup(hint.min, hint.max, 1, false, p_hint == PROPERTY_HINT_LINK, hint.suffix);
editor->setup(hint.min, hint.max, 1, false, p_hint == PROPERTY_HINT_LINK, hint.suffix, false, true);
return editor;
} break;
@ -3704,7 +3705,7 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_
case Variant::VECTOR4I: {
EditorPropertyVector4i *editor = memnew(EditorPropertyVector4i);
EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1, true);
editor->setup(hint.min, hint.max, 1, false, p_hint == PROPERTY_HINT_LINK, hint.suffix);
editor->setup(hint.min, hint.max, 1, false, p_hint == PROPERTY_HINT_LINK, hint.suffix, false, true);
return editor;
} break;

View File

@ -447,6 +447,7 @@ void EditorPropertyArray::update_property() {
size_slider = memnew(EditorSpinSlider);
size_slider->set_step(1);
size_slider->set_max(INT32_MAX);
size_slider->set_editing_integer(true);
size_slider->set_h_size_flags(SIZE_EXPAND_FILL);
size_slider->set_read_only(is_read_only());
size_slider->connect(SceneStringName(value_changed), callable_mp(this, &EditorPropertyArray::_length_changed));

View File

@ -153,7 +153,7 @@ void EditorPropertyVectorN::_notification(int p_what) {
}
}
void EditorPropertyVectorN::setup(double p_min, double p_max, double p_step, bool p_hide_slider, bool p_link, const String &p_suffix, bool p_radians_as_degrees) {
void EditorPropertyVectorN::setup(double p_min, double p_max, double p_step, bool p_hide_slider, bool p_link, const String &p_suffix, bool p_radians_as_degrees, bool p_is_int) {
radians_as_degrees = p_radians_as_degrees;
for (EditorSpinSlider *spin : spin_sliders) {
@ -164,6 +164,7 @@ void EditorPropertyVectorN::setup(double p_min, double p_max, double p_step, boo
spin->set_allow_greater(true);
spin->set_allow_lesser(true);
spin->set_suffix(p_suffix);
spin->set_editing_integer(p_is_int);
}
if (!p_link) {

View File

@ -62,7 +62,7 @@ protected:
public:
virtual void update_property() override;
void setup(double p_min, double p_max, double p_step = 1.0, bool p_hide_slider = true, bool p_link = false, const String &p_suffix = String(), bool p_radians_as_degrees = false);
void setup(double p_min, double p_max, double p_step = 1.0, bool p_hide_slider = true, bool p_link = false, const String &p_suffix = String(), bool p_radians_as_degrees = false, bool p_is_int = false);
EditorPropertyVectorN(Variant::Type p_type, bool p_force_wide, bool p_horizontal);
};

View File

@ -719,6 +719,9 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("text_editor/behavior/files/auto_reload_and_parse_scripts_on_save", true);
_initial_set("text_editor/behavior/files/open_dominant_script_on_scene_change", false, true);
// Behavior: Documentation
_initial_set("text_editor/behavior/documentation/enable_tooltips", true, true);
// Script list
_initial_set("text_editor/script_list/show_members_overview", true, true);
_initial_set("text_editor/script_list/sort_members_outline_alphabetically", false, true);
@ -936,17 +939,20 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("run/window_placement/rect_custom_position", Vector2());
EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "run/window_placement/screen", -5, screen_hints)
#endif
// Should match the ANDROID_WINDOW_* constants in 'platform/android/java/editor/src/main/java/org/godotengine/editor/GodotEditor.kt'
String android_window_hints = "Auto (based on screen size):0,Same as Editor:1,Side-by-side with Editor:2,Launch in PiP mode:3";
// Should match the ANDROID_WINDOW_* constants in 'platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt'.
String android_window_hints = "Auto (based on screen size):0,Same as Editor:1,Side-by-side with Editor:2";
EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "run/window_placement/android_window", 0, android_window_hints)
EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "run/window_placement/game_embed_mode", 0, "Use Per-Project Configuration:0,Embed Game:1,Make Game Workspace Floating:2,Disabled:3");
int default_play_window_pip_mode = 0;
String game_embed_mode_hints = "Disabled:-1,Use Per-Project Configuration:0,Embed Game:1,Make Game Workspace Floating:2";
#ifdef ANDROID_ENABLED
default_play_window_pip_mode = 2;
if (OS::get_singleton()->has_feature("xr_editor")) {
game_embed_mode_hints = "Disabled:-1";
} else {
game_embed_mode_hints = "Disabled:-1,Auto (based on screen size):0,Enabled:1";
}
#endif
EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "run/window_placement/play_window_pip_mode", default_play_window_pip_mode, "Disabled:0,Enabled:1,Enabled when Play window is same as Editor:2")
int default_game_embed_mode = OS::get_singleton()->has_feature("xr_editor") ? -1 : 0;
EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "run/window_placement/game_embed_mode", default_game_embed_mode, game_embed_mode_hints);
// Auto save
_initial_set("run/auto_save/save_before_running", true, true);

View File

@ -1291,12 +1291,13 @@ void FileSystemDock::_tree_activate_file() {
String file_path = selected->get_metadata(0);
TreeItem *parent = selected->get_parent();
bool is_favorite = parent != nullptr && parent->get_metadata(0) == "Favorites";
bool is_folder = file_path.ends_with("/");
if ((!is_favorite && file_path.ends_with("/")) || file_path == "Favorites") {
if ((!is_favorite && is_folder) || file_path == "Favorites") {
bool collapsed = selected->is_collapsed();
selected->set_collapsed(!collapsed);
} else {
_select_file(file_path, is_favorite && !file_path.ends_with("/"), false);
_select_file(file_path, is_favorite && !is_folder, is_favorite && is_folder);
}
}
}
@ -1488,11 +1489,6 @@ void FileSystemDock::_try_move_item(const FileOrFolder &p_item, const String &p_
break;
}
}
} else {
Ref<Resource> res = ResourceCache::get_ref(old_path);
if (res.is_valid()) {
res->set_path_cache(new_path);
}
}
}
@ -2058,7 +2054,7 @@ Vector<String> FileSystemDock::_tree_get_selected(bool remove_self_inclusion, bo
TreeItem *selected = tree->get_root();
selected = tree->get_next_selected(selected);
while (selected) {
if (selected != cursor_item && selected != favorites_item) {
if (selected != cursor_item && selected != favorites_item && selected->is_visible_in_tree()) {
selected_strings.push_back(selected->get_metadata(0));
}
selected = tree->get_next_selected(selected);

View File

@ -220,14 +220,15 @@ QuickOpenResultContainer::QuickOpenResultContainer() {
list = memnew(VBoxContainer);
list->set_h_size_flags(Control::SIZE_EXPAND_FILL);
list->add_theme_constant_override(SNAME("separation"), 0);
list->hide();
scroll_container->add_child(list);
grid = memnew(HFlowContainer);
grid->set_h_size_flags(Control::SIZE_EXPAND_FILL);
grid->set_v_size_flags(Control::SIZE_EXPAND_FILL);
grid->add_theme_constant_override("v_separation", 18);
grid->add_theme_constant_override("h_separation", 4);
grid->add_theme_constant_override(SNAME("v_separation"), 0);
grid->add_theme_constant_override(SNAME("h_separation"), 0);
grid->hide();
scroll_container->add_child(grid);
@ -354,12 +355,17 @@ void QuickOpenResultContainer::init(const Vector<StringName> &p_base_types) {
QuickOpenResultCandidate *candidates_write = loaded_candidates.ptrw();
int i = 0;
for (const String &path : paths) {
if (!ResourceLoader::exists(path)) {
continue;
}
filetypes.insert(path, type_name);
QuickOpenResultCandidate candidate;
_setup_candidate(candidate, path);
candidates_write[i] = candidate;
i++;
}
loaded_candidates.resize(i);
selected_history.insert(type, loaded_candidates);
}
}
@ -411,7 +417,12 @@ void QuickOpenResultContainer::set_query_and_update(const String &p_query) {
}
void QuickOpenResultContainer::_setup_candidate(QuickOpenResultCandidate &p_candidate, const String &p_filepath) {
p_candidate.file_path = p_filepath;
ResourceUID::ID id = EditorFileSystem::get_singleton()->get_file_uid(p_filepath);
if (id == ResourceUID::INVALID_ID) {
p_candidate.file_path = p_filepath;
} else {
p_candidate.file_path = ResourceUID::get_singleton()->id_to_text(id);
}
p_candidate.result = nullptr;
StringName actual_type;
@ -716,7 +727,7 @@ bool QuickOpenResultContainer::has_nothing_selected() const {
String QuickOpenResultContainer::get_selected() const {
ERR_FAIL_COND_V_MSG(has_nothing_selected(), String(), "Tried to get selected file, but nothing was selected.");
return candidates[selection_index].file_path;
return ResourceUID::ensure_path(candidates[selection_index].file_path);
}
QuickOpenDisplayMode QuickOpenResultContainer::get_adaptive_display_mode(const Vector<StringName> &p_base_types) {
@ -899,7 +910,7 @@ void QuickOpenResultItem::_notification(int p_what) {
} break;
case NOTIFICATION_THEME_CHANGED: {
selected_stylebox = get_theme_stylebox("selected", "Tree");
hovering_stylebox = get_theme_stylebox(SceneStringName(hover), "Tree");
hovering_stylebox = get_theme_stylebox(SNAME("hovered"), "Tree");
highlighted_font_color = get_theme_color("font_focus_color", EditorStringName(Editor));
} break;
case NOTIFICATION_DRAW: {
@ -932,49 +943,47 @@ static Vector2i _get_name_interval(const Vector2i &p_interval, int p_dir_index)
QuickOpenResultListItem::QuickOpenResultListItem() {
set_h_size_flags(Control::SIZE_EXPAND_FILL);
add_theme_constant_override("separation", 4 * EDSCALE);
add_theme_constant_override("margin_left", 6 * EDSCALE);
add_theme_constant_override("margin_right", 6 * EDSCALE);
{
image_container = memnew(MarginContainer);
image_container->add_theme_constant_override("margin_top", 2 * EDSCALE);
image_container->add_theme_constant_override("margin_bottom", 2 * EDSCALE);
image_container->add_theme_constant_override("margin_left", CONTAINER_MARGIN * EDSCALE);
image_container->add_theme_constant_override("margin_right", 0);
add_child(image_container);
hbc = memnew(HBoxContainer);
hbc->add_theme_constant_override(SNAME("separation"), 4 * EDSCALE);
add_child(hbc);
thumbnail = memnew(TextureRect);
thumbnail->set_h_size_flags(Control::SIZE_SHRINK_CENTER);
thumbnail->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
thumbnail->set_expand_mode(TextureRect::EXPAND_IGNORE_SIZE);
thumbnail->set_stretch_mode(TextureRect::StretchMode::STRETCH_SCALE);
image_container->add_child(thumbnail);
}
const int max_size = 36 * EDSCALE;
{
text_container = memnew(VBoxContainer);
text_container->add_theme_constant_override("separation", -6 * EDSCALE);
text_container->set_h_size_flags(Control::SIZE_EXPAND_FILL);
text_container->set_v_size_flags(Control::SIZE_FILL);
add_child(text_container);
thumbnail = memnew(TextureRect);
thumbnail->set_h_size_flags(Control::SIZE_SHRINK_CENTER);
thumbnail->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
thumbnail->set_expand_mode(TextureRect::EXPAND_IGNORE_SIZE);
thumbnail->set_stretch_mode(TextureRect::STRETCH_KEEP_ASPECT_CENTERED);
thumbnail->set_custom_minimum_size(Size2i(max_size, max_size));
hbc->add_child(thumbnail);
name = memnew(HighlightedLabel);
name->set_h_size_flags(Control::SIZE_EXPAND_FILL);
name->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS);
name->set_horizontal_alignment(HorizontalAlignment::HORIZONTAL_ALIGNMENT_LEFT);
text_container->add_child(name);
text_container = memnew(VBoxContainer);
text_container->add_theme_constant_override(SNAME("separation"), -7 * EDSCALE);
text_container->set_h_size_flags(Control::SIZE_EXPAND_FILL);
text_container->set_v_size_flags(Control::SIZE_FILL);
hbc->add_child(text_container);
path = memnew(HighlightedLabel);
path->set_h_size_flags(Control::SIZE_EXPAND_FILL);
path->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS);
path->add_theme_font_size_override(SceneStringName(font_size), 12 * EDSCALE);
text_container->add_child(path);
}
name = memnew(HighlightedLabel);
name->set_h_size_flags(Control::SIZE_EXPAND_FILL);
name->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS);
name->set_horizontal_alignment(HorizontalAlignment::HORIZONTAL_ALIGNMENT_LEFT);
text_container->add_child(name);
path = memnew(HighlightedLabel);
path->set_h_size_flags(Control::SIZE_EXPAND_FILL);
path->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS);
path->add_theme_font_size_override(SceneStringName(font_size), 12 * EDSCALE);
text_container->add_child(path);
}
void QuickOpenResultListItem::set_content(const QuickOpenResultCandidate &p_candidate, bool p_highlight) {
thumbnail->set_texture(p_candidate.thumbnail);
name->set_text(p_candidate.file_path.get_file());
path->set_text(p_candidate.file_path.get_base_dir());
const String file_path = ResourceUID::ensure_path(p_candidate.file_path);
name->set_text(file_path.get_file());
path->set_text(file_path.get_base_dir());
name->reset_highlights();
path->reset_highlights();
@ -986,21 +995,6 @@ void QuickOpenResultListItem::set_content(const QuickOpenResultCandidate &p_cand
}
}
}
const int max_size = 32 * EDSCALE;
bool uses_icon = p_candidate.thumbnail->get_width() < max_size;
if (uses_icon) {
thumbnail->set_custom_minimum_size(p_candidate.thumbnail->get_size());
int margin_needed = (max_size - p_candidate.thumbnail->get_width()) / 2;
image_container->add_theme_constant_override("margin_left", CONTAINER_MARGIN + margin_needed);
image_container->add_theme_constant_override("margin_right", margin_needed);
} else {
thumbnail->set_custom_minimum_size(Size2i(max_size, max_size));
image_container->add_theme_constant_override("margin_left", CONTAINER_MARGIN);
image_container->add_theme_constant_override("margin_right", 0);
}
}
void QuickOpenResultListItem::reset() {
@ -1030,28 +1024,38 @@ void QuickOpenResultListItem::_notification(int p_what) {
//--------------- Grid Item
QuickOpenResultGridItem::QuickOpenResultGridItem() {
set_h_size_flags(Control::SIZE_FILL);
set_v_size_flags(Control::SIZE_EXPAND_FILL);
add_theme_constant_override("separation", -2 * EDSCALE);
set_custom_minimum_size(Size2i(120 * EDSCALE, 0));
add_theme_constant_override("margin_top", 6 * EDSCALE);
add_theme_constant_override("margin_left", 2 * EDSCALE);
add_theme_constant_override("margin_right", 2 * EDSCALE);
vbc = memnew(VBoxContainer);
vbc->set_h_size_flags(Control::SIZE_FILL);
vbc->set_v_size_flags(Control::SIZE_EXPAND_FILL);
vbc->add_theme_constant_override(SNAME("separation"), 0);
add_child(vbc);
const int max_size = 64 * EDSCALE;
thumbnail = memnew(TextureRect);
thumbnail->set_h_size_flags(Control::SIZE_SHRINK_CENTER);
thumbnail->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
thumbnail->set_custom_minimum_size(Size2i(120 * EDSCALE, 64 * EDSCALE));
add_child(thumbnail);
thumbnail->set_custom_minimum_size(Size2i(max_size, max_size));
vbc->add_child(thumbnail);
name = memnew(HighlightedLabel);
name->set_h_size_flags(Control::SIZE_EXPAND_FILL);
name->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS);
name->set_horizontal_alignment(HorizontalAlignment::HORIZONTAL_ALIGNMENT_CENTER);
name->add_theme_font_size_override(SceneStringName(font_size), 13 * EDSCALE);
add_child(name);
vbc->add_child(name);
}
void QuickOpenResultGridItem::set_content(const QuickOpenResultCandidate &p_candidate, bool p_highlight) {
thumbnail->set_texture(p_candidate.thumbnail);
name->set_text(p_candidate.file_path.get_file());
name->set_tooltip_text(p_candidate.file_path);
const String file_path = ResourceUID::ensure_path(p_candidate.file_path);
name->set_text(file_path.get_file());
name->set_tooltip_text(file_path);
name->reset_highlights();
if (p_highlight && p_candidate.result != nullptr) {

View File

@ -33,6 +33,7 @@
#include "core/templates/oa_hash_map.h"
#include "scene/gui/dialogs.h"
#include "scene/gui/margin_container.h"
class Button;
class CenterContainer;
@ -176,8 +177,8 @@ private:
static void _bind_methods();
};
class QuickOpenResultGridItem : public VBoxContainer {
GDCLASS(QuickOpenResultGridItem, VBoxContainer)
class QuickOpenResultGridItem : public MarginContainer {
GDCLASS(QuickOpenResultGridItem, MarginContainer)
public:
QuickOpenResultGridItem();
@ -188,12 +189,13 @@ public:
void remove_highlight();
private:
VBoxContainer *vbc = nullptr;
TextureRect *thumbnail = nullptr;
HighlightedLabel *name = nullptr;
};
class QuickOpenResultListItem : public HBoxContainer {
GDCLASS(QuickOpenResultListItem, HBoxContainer)
class QuickOpenResultListItem : public MarginContainer {
GDCLASS(QuickOpenResultListItem, MarginContainer)
public:
QuickOpenResultListItem();
@ -207,9 +209,7 @@ protected:
void _notification(int p_what);
private:
static const int CONTAINER_MARGIN = 8;
MarginContainer *image_container = nullptr;
HBoxContainer *hbc = nullptr;
VBoxContainer *text_container = nullptr;
TextureRect *thumbnail = nullptr;

View File

@ -1170,6 +1170,9 @@ void SceneTreeEditor::_compute_hash(Node *p_node, uint64_t &hash) {
}
void SceneTreeEditor::_reset() {
// Stop any waiting change to tooltip.
update_node_tooltip_delay->stop();
tree->clear();
node_cache.clear();
}
@ -1571,7 +1574,6 @@ void SceneTreeEditor::rename_node(Node *p_node, const String &p_name, TreeItem *
undo_redo->add_undo_method(item, "set_metadata", 0, p_node->get_path());
undo_redo->add_undo_method(item, "set_text", 0, p_node->get_name());
p_node->set_name(new_name);
undo_redo->add_do_method(p_node, "set_name", new_name);
undo_redo->add_do_method(item, "set_metadata", 0, p_node->get_path());
undo_redo->add_do_method(item, "set_text", 0, new_name);

View File

@ -253,6 +253,7 @@ HistoryDock::HistoryDock() {
current_scene_checkbox->set_text(TTR("Scene"));
current_scene_checkbox->set_h_size_flags(SIZE_EXPAND_FILL);
current_scene_checkbox->set_clip_text(true);
current_scene_checkbox->set_pressed(true);
current_scene_checkbox->connect(SceneStringName(toggled), callable_mp(this, &HistoryDock::refresh_history).unbind(1));
global_history_checkbox = memnew(CheckBox);
@ -261,6 +262,7 @@ HistoryDock::HistoryDock() {
global_history_checkbox->set_text(TTR("Global"));
global_history_checkbox->set_h_size_flags(SIZE_EXPAND_FILL);
global_history_checkbox->set_clip_text(true);
global_history_checkbox->set_pressed(true);
global_history_checkbox->connect(SceneStringName(toggled), callable_mp(this, &HistoryDock::refresh_history).unbind(1));
action_list = memnew(ItemList);

View File

@ -473,6 +473,7 @@ void DynamicFontImportSettingsDialog::_main_prop_changed(const String &p_edited_
if (font_preview.is_valid()) {
if (p_edited_property == "antialiasing") {
font_preview->set_antialiasing((TextServer::FontAntialiasing)import_settings_data->get("antialiasing").operator int());
_variations_validate();
} else if (p_edited_property == "generate_mipmaps") {
font_preview->set_generate_mipmaps(import_settings_data->get("generate_mipmaps"));
} else if (p_edited_property == "disable_embedded_bitmaps") {
@ -492,7 +493,16 @@ void DynamicFontImportSettingsDialog::_main_prop_changed(const String &p_edited_
} else if (p_edited_property == "hinting") {
font_preview->set_hinting((TextServer::Hinting)import_settings_data->get("hinting").operator int());
} else if (p_edited_property == "subpixel_positioning") {
font_preview->set_subpixel_positioning((TextServer::SubpixelPositioning)import_settings_data->get("subpixel_positioning").operator int());
int font_subpixel_positioning = import_settings_data->get("subpixel_positioning").operator int();
if (font_subpixel_positioning == 4 /* Auto (Except Pixel Fonts) */) {
if (is_pixel) {
font_subpixel_positioning = TextServer::SUBPIXEL_POSITIONING_DISABLED;
} else {
font_subpixel_positioning = TextServer::SUBPIXEL_POSITIONING_AUTO;
}
}
font_preview->set_subpixel_positioning((TextServer::SubpixelPositioning)font_subpixel_positioning);
_variations_validate();
} else if (p_edited_property == "keep_rounding_remainders") {
font_preview->set_keep_rounding_remainders(import_settings_data->get("keep_rounding_remainders"));
} else if (p_edited_property == "oversampling") {
@ -620,7 +630,15 @@ void DynamicFontImportSettingsDialog::_variations_validate() {
if ((TextServer::FontAntialiasing)(int)import_settings_data->get("antialiasing") == TextServer::FONT_ANTIALIASING_LCD) {
warn += "\n" + TTR("Note: LCD Subpixel antialiasing is selected, each of the glyphs will be pre-rendered for all supported subpixel layouts (5x).");
}
if ((TextServer::SubpixelPositioning)(int)import_settings_data->get("subpixel_positioning") != TextServer::SUBPIXEL_POSITIONING_DISABLED) {
int font_subpixel_positioning = import_settings_data->get("subpixel_positioning").operator int();
if (font_subpixel_positioning == 4 /* Auto (Except Pixel Fonts) */) {
if (is_pixel) {
font_subpixel_positioning = TextServer::SUBPIXEL_POSITIONING_DISABLED;
} else {
font_subpixel_positioning = TextServer::SUBPIXEL_POSITIONING_AUTO;
}
}
if ((TextServer::SubpixelPositioning)font_subpixel_positioning != TextServer::SUBPIXEL_POSITIONING_DISABLED) {
warn += "\n" + TTR("Note: Subpixel positioning is selected, each of the glyphs might be pre-rendered for multiple subpixel offsets (up to 4x).");
}
if (warn.is_empty()) {
@ -1087,6 +1105,34 @@ void DynamicFontImportSettingsDialog::open_settings(const String &p_path) {
font_preview.instantiate();
font_preview->set_data(font_data);
Array rids = font_preview->get_rids();
if (!rids.is_empty()) {
PackedInt32Array glyphs = TS->font_get_supported_glyphs(rids[0]);
is_pixel = true;
for (int32_t gl : glyphs) {
Dictionary ct = TS->font_get_glyph_contours(rids[0], 16, gl);
PackedInt32Array contours = ct["contours"];
PackedVector3Array points = ct["points"];
int prev_start = 0;
for (int i = 0; i < contours.size(); i++) {
for (int j = prev_start; j <= contours[i]; j++) {
int next_point = (j < contours[i]) ? (j + 1) : prev_start;
if ((points[j].z != TextServer::CONTOUR_CURVE_TAG_ON) || (!Math::is_equal_approx(points[j].x, points[next_point].x) && !Math::is_equal_approx(points[j].y, points[next_point].y))) {
is_pixel = false;
break;
}
}
prev_start = contours[i] + 1;
if (!is_pixel) {
break;
}
}
if (!is_pixel) {
break;
}
}
}
String font_name = vformat("%s (%s)", font_preview->get_font_name(), font_preview->get_font_style_name());
String sample;
static const String sample_base = U"12漢字ԱբΑαАбΑαאבابܐܒހށआআਆઆଆஆఆಆആආกิກິༀကႠა한글ᎣᐁᚁᚠᜀᜠᝀᝠកᠠᤁᥐAb😀";
@ -1237,7 +1283,15 @@ void DynamicFontImportSettingsDialog::open_settings(const String &p_path) {
font_preview->set_allow_system_fallback(import_settings_data->get("allow_system_fallback"));
font_preview->set_force_autohinter(import_settings_data->get("force_autohinter"));
font_preview->set_hinting((TextServer::Hinting)import_settings_data->get("hinting").operator int());
font_preview->set_subpixel_positioning((TextServer::SubpixelPositioning)import_settings_data->get("subpixel_positioning").operator int());
int font_subpixel_positioning = import_settings_data->get("subpixel_positioning").operator int();
if (font_subpixel_positioning == 4 /* Auto (Except Pixel Fonts) */) {
if (is_pixel) {
font_subpixel_positioning = TextServer::SUBPIXEL_POSITIONING_DISABLED;
} else {
font_subpixel_positioning = TextServer::SUBPIXEL_POSITIONING_AUTO;
}
}
font_preview->set_subpixel_positioning((TextServer::SubpixelPositioning)font_subpixel_positioning);
font_preview->set_keep_rounding_remainders(import_settings_data->get("keep_rounding_remainders"));
font_preview->set_oversampling(import_settings_data->get("oversampling"));
}
@ -1270,7 +1324,7 @@ DynamicFontImportSettingsDialog::DynamicFontImportSettingsDialog() {
options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::BOOL, "allow_system_fallback"), true));
options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::BOOL, "force_autohinter"), false));
options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::INT, "hinting", PROPERTY_HINT_ENUM, "None,Light,Normal"), 1));
options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::INT, "subpixel_positioning", PROPERTY_HINT_ENUM, "Disabled,Auto,One Half of a Pixel,One Quarter of a Pixel"), 1));
options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::INT, "subpixel_positioning", PROPERTY_HINT_ENUM, "Disabled,Auto,One Half of a Pixel,One Quarter of a Pixel,Auto (Except Pixel Fonts)"), 4));
options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::BOOL, "keep_rounding_remainders"), true));
options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::FLOAT, "oversampling", PROPERTY_HINT_RANGE, "0,10,0.1"), 0.0));

View File

@ -84,6 +84,8 @@ class DynamicFontImportSettingsDialog : public ConfirmationDialog {
List<ResourceImporter::ImportOption> options_variations;
List<ResourceImporter::ImportOption> options_general;
bool is_pixel = false;
// Root layout
Label *label_warn = nullptr;
TabContainer *main_pages = nullptr;

View File

@ -182,36 +182,39 @@ Error ResourceImporterDynamicFont::import(ResourceUID::ID p_source_id, const Str
font->set_fallbacks(fallbacks);
if (subpixel_positioning == 4 /* Auto (Except Pixel Fonts) */) {
PackedInt32Array glyphs = TS->font_get_supported_glyphs(font->get_rids()[0]);
bool is_pixel = true;
for (int32_t gl : glyphs) {
Dictionary ct = TS->font_get_glyph_contours(font->get_rids()[0], 16, gl);
PackedInt32Array contours = ct["contours"];
PackedVector3Array points = ct["points"];
int prev_start = 0;
for (int i = 0; i < contours.size(); i++) {
for (int j = prev_start; j <= contours[i]; j++) {
int next_point = (j < contours[i]) ? (j + 1) : prev_start;
if ((points[j].z != TextServer::CONTOUR_CURVE_TAG_ON) || (!Math::is_equal_approx(points[j].x, points[next_point].x) && !Math::is_equal_approx(points[j].y, points[next_point].y))) {
is_pixel = false;
Array rids = font->get_rids();
if (!rids.is_empty()) {
PackedInt32Array glyphs = TS->font_get_supported_glyphs(rids[0]);
bool is_pixel = true;
for (int32_t gl : glyphs) {
Dictionary ct = TS->font_get_glyph_contours(rids[0], 16, gl);
PackedInt32Array contours = ct["contours"];
PackedVector3Array points = ct["points"];
int prev_start = 0;
for (int i = 0; i < contours.size(); i++) {
for (int j = prev_start; j <= contours[i]; j++) {
int next_point = (j < contours[i]) ? (j + 1) : prev_start;
if ((points[j].z != TextServer::CONTOUR_CURVE_TAG_ON) || (!Math::is_equal_approx(points[j].x, points[next_point].x) && !Math::is_equal_approx(points[j].y, points[next_point].y))) {
is_pixel = false;
break;
}
}
prev_start = contours[i] + 1;
if (!is_pixel) {
break;
}
}
prev_start = contours[i] + 1;
if (!is_pixel) {
break;
}
}
if (!is_pixel) {
break;
if (is_pixel && !glyphs.is_empty()) {
print_line(vformat("%s: Pixel font detected, disabling subpixel positioning.", p_source_file));
subpixel_positioning = TextServer::SUBPIXEL_POSITIONING_DISABLED;
} else {
subpixel_positioning = TextServer::SUBPIXEL_POSITIONING_AUTO;
}
}
if (is_pixel && !glyphs.is_empty()) {
print_line(vformat("%s: Pixel font detected, disabling subpixel positioning.", p_source_file));
subpixel_positioning = TextServer::SUBPIXEL_POSITIONING_DISABLED;
} else {
subpixel_positioning = TextServer::SUBPIXEL_POSITIONING_AUTO;
}
}
font->set_subpixel_positioning((TextServer::SubpixelPositioning)subpixel_positioning);
font->set_keep_rounding_remainders(keep_rounding_remainders);

View File

@ -159,7 +159,7 @@ Error ResourceImporterImageFont::import(ResourceUID::ID p_source_id, const Strin
c++; // Skip "+".
continue;
}
} else if (range[c] == '0' && (c <= range.length() - 2) && range[c + 1] == 'x') {
} else if (range[c] == '0' && (c <= range.length() - 2) && (range[c + 1] == 'x' || range[c + 1] == 'X')) {
// Read hexadecimal value, start.
token = String();
if (step == STEP_START_BEGIN) {

View File

@ -605,7 +605,7 @@ void AnimationLibraryEditor::_button_pressed(TreeItem *p_item, int p_column, int
file_popup->add_separator();
file_popup->add_item(TTR("Open in Inspector"), FILE_MENU_EDIT_LIBRARY);
Rect2 pos = tree->get_item_rect(p_item, 1, 0);
Vector2 popup_pos = tree->get_screen_transform().xform(pos.position + Vector2(0, pos.size.height)) - tree->get_scroll();
Vector2 popup_pos = tree->get_screen_transform().xform(pos.position + Vector2(0, pos.size.height));
file_popup->popup(Rect2(popup_pos, Size2()));
file_dialog_animation = StringName();
@ -645,7 +645,7 @@ void AnimationLibraryEditor::_button_pressed(TreeItem *p_item, int p_column, int
file_popup->add_separator();
file_popup->add_item(TTR("Open in Inspector"), FILE_MENU_EDIT_ANIMATION);
Rect2 pos = tree->get_item_rect(p_item, 1, 0);
Vector2 popup_pos = tree->get_screen_transform().xform(pos.position + Vector2(0, pos.size.height)) - tree->get_scroll();
Vector2 popup_pos = tree->get_screen_transform().xform(pos.position + Vector2(0, pos.size.height));
file_popup->popup(Rect2(popup_pos, Size2()));
file_dialog_animation = anim_name;

View File

@ -234,7 +234,8 @@ bool AnimationTreeEditor::can_edit(const Ref<AnimationNode> &p_node) const {
}
Vector<String> AnimationTreeEditor::get_animation_list() {
if (!singleton->tree || !singleton->is_visible()) {
// This can be called off the main thread due to resource preview generation. Quit early in that case.
if (!singleton->tree || !Thread::is_main_thread() || !singleton->is_visible()) {
// When tree is empty, singleton not in the main thread.
return Vector<String>();
}

View File

@ -623,7 +623,7 @@ void CanvasItemEditor::_find_canvas_items_at_pos(const Point2 &p_pos, Node *p_no
return;
}
xform = vp->get_popup_base_transform();
if (!vp->get_visible_rect().has_point(xform.xform_inv(p_pos))) {
if (!vp->get_visible_rect().has_point(xform.affine_inverse().xform(p_pos))) {
return;
}
}
@ -726,7 +726,7 @@ void CanvasItemEditor::_find_canvas_items_in_rect(const Rect2 &p_rect, Node *p_n
return;
}
xform = vp->get_popup_base_transform();
if (!vp->get_visible_rect().intersects(xform.xform_inv(p_rect))) {
if (!vp->get_visible_rect().intersects(xform.affine_inverse().xform(p_rect))) {
return;
}
}
@ -3659,10 +3659,12 @@ void CanvasItemEditor::_draw_selection() {
}
// Remove non-movable nodes.
for (CanvasItem *ci : selection) {
if (!_is_node_movable(ci)) {
selection.erase(ci);
for (List<CanvasItem *>::Element *E = selection.front(); E;) {
List<CanvasItem *>::Element *N = E->next();
if (!_is_node_movable(E->get())) {
selection.erase(E);
}
E = N;
}
if (!selection.is_empty() && transform_tool && show_transformation_gizmos) {

View File

@ -40,6 +40,12 @@ void EmbeddedProcess::_notification(int p_what) {
case NOTIFICATION_ENTER_TREE: {
window = get_window();
} break;
case NOTIFICATION_PROCESS: {
if (updated_embedded_process_queued) {
updated_embedded_process_queued = false;
_update_embedded_process();
}
} break;
case NOTIFICATION_DRAW: {
_draw();
} break;
@ -179,6 +185,7 @@ void EmbeddedProcess::embed_process(OS::ProcessID p_pid) {
start_embedding_time = OS::get_singleton()->get_ticks_msec();
embedding_grab_focus = has_focus();
timer_update_embedded_process->start();
set_process(true);
set_notify_transform(true);
// Attempt to embed the process, but if it has just started and the window is not ready yet,
@ -196,10 +203,17 @@ void EmbeddedProcess::reset() {
embedding_grab_focus = false;
timer_embedding->stop();
timer_update_embedded_process->stop();
set_process(false);
set_notify_transform(false);
queue_redraw();
}
void EmbeddedProcess::request_close() {
if (current_process_id != 0 && embedding_completed) {
DisplayServer::get_singleton()->request_close_embedded_process(current_process_id);
}
}
void EmbeddedProcess::_try_embed_process() {
bool is_visible = is_visible_in_tree();
Error err = DisplayServer::get_singleton()->embed_process(window->get_window_id(), current_process_id, get_screen_embedded_window_rect(), is_visible, is_visible && application_has_focus && embedding_grab_focus);
@ -245,11 +259,6 @@ void EmbeddedProcess::_timer_update_embedded_process_timeout() {
queue_update_embedded_process();
}
}
if (updated_embedded_process_queued) {
updated_embedded_process_queued = false;
_update_embedded_process();
}
}
void EmbeddedProcess::_update_embedded_process() {

View File

@ -76,6 +76,7 @@ protected:
public:
void embed_process(OS::ProcessID p_pid);
void reset();
void request_close();
void set_window_size(const Size2i p_window_size);
void set_keep_aspect(bool p_keep_aspect);

View File

@ -614,6 +614,10 @@ void GameView::_notification(int p_what) {
// Embedding available.
int game_mode = EDITOR_GET("run/window_placement/game_embed_mode");
switch (game_mode) {
case -1: { // Disabled.
embed_on_play = false;
make_floating_on_play = false;
} break;
case 1: { // Embed.
embed_on_play = true;
make_floating_on_play = false;
@ -622,10 +626,6 @@ void GameView::_notification(int p_what) {
embed_on_play = true;
make_floating_on_play = true;
} break;
case 3: { // Disabled.
embed_on_play = false;
make_floating_on_play = false;
} break;
default: {
embed_on_play = EditorSettings::get_singleton()->get_project_metadata("game_view", "embed_on_play", true);
make_floating_on_play = EditorSettings::get_singleton()->get_project_metadata("game_view", "make_floating_on_play", true);
@ -798,16 +798,17 @@ void GameView::_window_close_request() {
// Before the parent window closed, we close the embedded game. That prevents
// the embedded game to be seen without a parent window for a fraction of second.
if (EditorRunBar::get_singleton()->is_playing() && (embedded_process->is_embedding_completed() || embedded_process->is_embedding_in_progress())) {
// Try to gracefully close the window. That way, the NOTIFICATION_WM_CLOSE_REQUEST
// notification should be propagated in the game process.
embedded_process->reset();
// When the embedding is not complete, we need to kill the process.
// If the game is paused, the close request will not be processed by the game, so it's better to kill the process.
if (paused || embedded_process->is_embedding_in_progress()) {
embedded_process->reset();
// Call deferred to prevent the _stop_pressed callback to be executed before the wrapper window
// actually closes.
callable_mp(EditorRunBar::get_singleton(), &EditorRunBar::stop_playing).call_deferred();
} else {
// Try to gracefully close the window. That way, the NOTIFICATION_WM_CLOSE_REQUEST
// notification should be propagated in the game process.
embedded_process->request_close();
}
}
}
@ -1026,6 +1027,18 @@ GameView::GameView(Ref<GameViewDebugger> p_debugger, WindowWrapper *p_wrapper) {
///////
void GameViewPlugin::selected_notify() {
if (_is_window_wrapper_enabled()) {
#ifdef ANDROID_ENABLED
notify_main_screen_changed(get_plugin_name());
#else
window_wrapper->grab_window_focus();
#endif
_focus_another_editor();
}
}
#ifndef ANDROID_ENABLED
void GameViewPlugin::make_visible(bool p_visible) {
if (p_visible) {
window_wrapper->show();
@ -1034,13 +1047,6 @@ void GameViewPlugin::make_visible(bool p_visible) {
}
}
void GameViewPlugin::selected_notify() {
if (window_wrapper->get_window_enabled()) {
window_wrapper->grab_window_focus();
_focus_another_editor();
}
}
void GameViewPlugin::set_window_layout(Ref<ConfigFile> p_layout) {
game_view->set_window_layout(p_layout);
}
@ -1057,6 +1063,11 @@ Dictionary GameViewPlugin::get_state() const {
return game_view->get_state();
}
void GameViewPlugin::_window_visibility_changed(bool p_visible) {
_focus_another_editor();
}
#endif
void GameViewPlugin::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
@ -1081,13 +1092,11 @@ void GameViewPlugin::_feature_profile_changed() {
debugger->set_is_feature_enabled(is_feature_enabled);
}
#ifndef ANDROID_ENABLED
if (game_view) {
game_view->set_is_feature_enabled(is_feature_enabled);
}
}
void GameViewPlugin::_window_visibility_changed(bool p_visible) {
_focus_another_editor();
#endif
}
void GameViewPlugin::_save_last_editor(const String &p_editor) {
@ -1097,7 +1106,7 @@ void GameViewPlugin::_save_last_editor(const String &p_editor) {
}
void GameViewPlugin::_focus_another_editor() {
if (window_wrapper->get_window_enabled()) {
if (_is_window_wrapper_enabled()) {
if (last_editor.is_empty()) {
EditorNode::get_singleton()->get_editor_main_screen()->select(EditorMainScreen::EDITOR_2D);
} else {
@ -1106,13 +1115,22 @@ void GameViewPlugin::_focus_another_editor() {
}
}
bool GameViewPlugin::_is_window_wrapper_enabled() const {
#ifdef ANDROID_ENABLED
return true;
#else
return window_wrapper->get_window_enabled();
#endif
}
GameViewPlugin::GameViewPlugin() {
debugger.instantiate();
#ifndef ANDROID_ENABLED
window_wrapper = memnew(WindowWrapper);
window_wrapper->set_window_title(vformat(TTR("%s - Godot Engine"), TTR("Game Workspace")));
window_wrapper->set_margins_enabled(true);
debugger.instantiate();
game_view = memnew(GameView(debugger, window_wrapper));
game_view->set_v_size_flags(Control::SIZE_EXPAND_FILL);
@ -1122,6 +1140,7 @@ GameViewPlugin::GameViewPlugin() {
window_wrapper->set_v_size_flags(Control::SIZE_EXPAND_FILL);
window_wrapper->hide();
window_wrapper->connect("window_visibility_changed", callable_mp(this, &GameViewPlugin::_window_visibility_changed));
#endif
EditorFeatureProfileManager::get_singleton()->connect("current_feature_profile_changed", callable_mp(this, &GameViewPlugin::_feature_profile_changed));
}

View File

@ -32,6 +32,7 @@
#define GAME_VIEW_PLUGIN_H
#include "editor/debugger/editor_debugger_node.h"
#include "editor/editor_main_screen.h"
#include "editor/plugins/editor_debugger_plugin.h"
#include "editor/plugins/editor_plugin.h"
#include "scene/debugger/scene_debugger.h"
@ -208,17 +209,22 @@ public:
class GameViewPlugin : public EditorPlugin {
GDCLASS(GameViewPlugin, EditorPlugin);
#ifndef ANDROID_ENABLED
GameView *game_view = nullptr;
WindowWrapper *window_wrapper = nullptr;
#endif
Ref<GameViewDebugger> debugger;
String last_editor;
void _feature_profile_changed();
#ifndef ANDROID_ENABLED
void _window_visibility_changed(bool p_visible);
#endif
void _save_last_editor(const String &p_editor);
void _focus_another_editor();
bool _is_window_wrapper_enabled() const;
protected:
void _notification(int p_what);
@ -228,14 +234,19 @@ public:
bool has_main_screen() const override { return true; }
virtual void edit(Object *p_object) override {}
virtual bool handles(Object *p_object) const override { return false; }
virtual void make_visible(bool p_visible) override;
virtual void selected_notify() override;
Ref<GameViewDebugger> get_debugger() const { return debugger; }
#ifndef ANDROID_ENABLED
virtual void make_visible(bool p_visible) override;
virtual void set_window_layout(Ref<ConfigFile> p_layout) override;
virtual void get_window_layout(Ref<ConfigFile> p_layout) override;
virtual void set_state(const Dictionary &p_state) override;
virtual Dictionary get_state() const override;
#endif
GameViewPlugin();
~GameViewPlugin();

View File

@ -4268,6 +4268,7 @@ void Node3DEditorViewport::set_state(const Dictionary &p_state) {
previewing->connect(SceneStringName(tree_exiting), callable_mp(this, &Node3DEditorViewport::_preview_exited_scene));
RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), previewing->get_camera()); //replace
surface->queue_redraw();
previewing_camera = true;
preview_camera->set_pressed(true);
preview_camera->show();
}

View File

@ -497,6 +497,24 @@ ScriptEditor *ScriptEditor::script_editor = nullptr;
/*** SCRIPT EDITOR ******/
String ScriptEditor::_get_debug_tooltip(const String &p_text, Node *p_se) {
if (EDITOR_GET("text_editor/behavior/documentation/enable_tooltips")) {
return String();
}
// NOTE: See also `ScriptTextEditor::_show_symbol_tooltip()` for documentation tooltips enabled.
String debug_value = EditorDebuggerNode::get_singleton()->get_var_value(p_text);
if (!debug_value.is_empty()) {
constexpr int DISPLAY_LIMIT = 1024;
if (debug_value.size() > DISPLAY_LIMIT) {
debug_value = debug_value.left(DISPLAY_LIMIT) + "... " + TTR("(truncated)");
}
debug_value = TTR("Current value: ") + debug_value;
}
return debug_value;
}
void ScriptEditor::_breaked(bool p_breaked, bool p_can_debug) {
if (external_editor_active) {
return;
@ -2626,9 +2644,12 @@ bool ScriptEditor::edit(const Ref<Resource> &p_resource, int p_line, int p_col,
}
// If we delete a script within the filesystem, the original resource path
// is lost, so keep it as metadata to figure out the exact tab to delete.
// is lost, so keep it as `edited_file_data` to figure out the exact tab to delete.
se->edited_file_data.path = p_resource->get_path();
se->edited_file_data.last_modified_time = FileAccess::get_modified_time(p_resource->get_path());
se->set_tooltip_request_func(callable_mp(this, &ScriptEditor::_get_debug_tooltip));
if (se->get_edit_menu()) {
se->get_edit_menu()->hide();
menu_hb->add_child(se->get_edit_menu());

View File

@ -440,6 +440,7 @@ class ScriptEditor : public PanelContainer {
void _goto_script_line(Ref<RefCounted> p_script, int p_line);
void _set_execution(Ref<RefCounted> p_script, int p_line);
void _clear_execution(Ref<RefCounted> p_script);
String _get_debug_tooltip(const String &p_text, Node *p_se);
void _breaked(bool p_breaked, bool p_can_debug);
void _script_created(Ref<Script> p_script);
void _set_breakpoint(Ref<RefCounted> p_script, int p_line, bool p_enabled);

View File

@ -1103,6 +1103,10 @@ void ScriptTextEditor::_validate_symbol(const String &p_symbol) {
}
void ScriptTextEditor::_show_symbol_tooltip(const String &p_symbol, int p_row, int p_column) {
if (!EDITOR_GET("text_editor/behavior/documentation/enable_tooltips").booleanize()) {
return;
}
if (p_symbol.begins_with("res://") || p_symbol.begins_with("uid://")) {
EditorHelpBitTooltip::show_tooltip(code_editor->get_text_editor(), "resource||" + p_symbol);
return;
@ -1203,19 +1207,14 @@ void ScriptTextEditor::_show_symbol_tooltip(const String &p_symbol, int p_row, i
}
}
// NOTE: See also `ScriptEditor::_get_debug_tooltip()` for documentation tooltips disabled.
String debug_value = EditorDebuggerNode::get_singleton()->get_var_value(p_symbol);
if (!debug_value.is_empty()) {
constexpr int DISPLAY_LIMIT = 1024;
if (debug_value.size() > DISPLAY_LIMIT) {
debug_value = debug_value.left(DISPLAY_LIMIT) + "... " + TTR("(truncated)");
}
debug_value = debug_value.replace("[", "[lb]");
if (doc_symbol.is_empty()) {
debug_value = p_symbol + ": " + debug_value;
} else {
debug_value = TTR("Current value: ") + debug_value;
}
debug_value = TTR("Current value: ") + debug_value.replace("[", "[lb]");
}
if (!doc_symbol.is_empty() || !debug_value.is_empty()) {

View File

@ -502,6 +502,9 @@ ProjectList::Item ProjectList::load_project_data(const String &p_path, bool p_fa
if (icon.is_empty()) {
WARN_PRINT(vformat("Could not load icon from UID for project at path \"%s\". Make sure UID cache exists.", p_path));
}
} else {
// Cache does not exist yet, so ignore and fallback to default icon.
icon = "";
}
}

View File

@ -966,7 +966,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
p_theme->set_constant("v_separation", "Tree", p_config.separation_margin);
p_theme->set_constant("h_separation", "Tree", (p_config.increased_margin + 2) * EDSCALE);
p_theme->set_constant("guide_width", "Tree", p_config.border_width);
p_theme->set_constant("item_margin", "Tree", 3 * p_config.increased_margin * EDSCALE);
p_theme->set_constant("item_margin", "Tree", MAX(3 * p_config.increased_margin * EDSCALE, 12 * EDSCALE));
p_theme->set_constant("inner_item_margin_top", "Tree", p_config.separation_margin);
p_theme->set_constant("inner_item_margin_bottom", "Tree", p_config.separation_margin);
p_theme->set_constant("inner_item_margin_left", "Tree", p_config.increased_margin * EDSCALE);
@ -1073,6 +1073,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
p_theme->set_stylebox("hovered_selected_focus", "ItemList", style_itemlist_hover_selected);
p_theme->set_color(SceneStringName(font_color), "ItemList", p_config.font_color);
p_theme->set_color("font_hovered_color", "ItemList", p_config.mono_color);
p_theme->set_color("font_hovered_selected_color", "ItemList", p_config.mono_color);
p_theme->set_color("font_selected_color", "ItemList", p_config.mono_color);
p_theme->set_color("font_outline_color", "ItemList", p_config.font_outline_color);
p_theme->set_color("guide_color", "ItemList", Color(1, 1, 1, 0));

File diff suppressed because it is too large Load Diff

View File

@ -20,13 +20,14 @@
# Vosh <vosh4k@gmail.com>, 2022.
# 100daysummer <bobbydochev@gmail.com>, 2023, 2024.
# Филип Узунов <filkata@gmail.com>, 2024.
# "П@₿€л" <pavel.veselinov.georgiev@gmail.com>, 2024.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor interface\n"
"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2024-06-30 18:47+0000\n"
"Last-Translator: 100daysummer <bobbydochev@gmail.com>\n"
"PO-Revision-Date: 2024-10-02 07:34+0000\n"
"Last-Translator: \"П@₿€л\" <pavel.veselinov.georgiev@gmail.com>\n"
"Language-Team: Bulgarian <https://hosted.weblate.org/projects/godot-engine/"
"godot/bg/>\n"
"Language: bg\n"
@ -34,7 +35,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 5.7-dev\n"
"X-Generator: Weblate 5.8-dev\n"
msgid "Main Thread"
msgstr "Главна нишка"
@ -111,6 +112,30 @@ msgstr "Джойстик 4 X-Ос"
msgid "Joystick 4 Y-Axis"
msgstr "Джойстик 4 Y-Ос"
msgid "Unknown Joypad Axis"
msgstr "Неизвестна ос на джойпада"
msgid "Joypad Motion on Axis %d (%s) with Value %.2f"
msgstr "Движение на джойстика по ос %d (%s) със стойност %.2f"
msgid "Guide, Sony PS, Xbox Home"
msgstr "Ръководство, Sony PS, Xbox Начало"
msgid "Start, Xbox Menu, Nintendo +"
msgstr "Старт, Xbox меню, Nintendo +"
msgid "Left Stick, Sony L3, Xbox L/LS"
msgstr "Ляв Стик, Sony L3, Xbox L/LS"
msgid "Right Stick, Sony R3, Xbox R/RS"
msgstr "Десен Стик, Sony R3, Xbox R/RS"
msgid "Left Shoulder, Sony L1, Xbox LB"
msgstr "Ляво Рамо, Sony L1, Xbox LB"
msgid "Right Shoulder, Sony R1, Xbox RB"
msgstr "Дясно Рамо, Sony R1, Xbox RB"
msgid "D-pad Up"
msgstr "Кръстат бутон нагоре"
@ -123,9 +148,30 @@ msgstr "Кръстат бутон наляво"
msgid "D-pad Right"
msgstr "Кръстат бутон надясно"
msgid "Xbox Share, PS5 Microphone, Nintendo Capture"
msgstr "Xbox Споделяне, PS5 Микрофон, Nintendo Улавяне"
msgid "Xbox Paddle 1"
msgstr "Xbox Гребло 1"
msgid "Xbox Paddle 2"
msgstr "Xbox Гребло 2"
msgid "Xbox Paddle 3"
msgstr "Xbox Гребло 3"
msgid "Xbox Paddle 4"
msgstr "Xbox Гребло 4"
msgid "PS4/5 Touchpad"
msgstr "PS4/5 Тъчпад"
msgid "Joypad Button %d"
msgstr "Бутон %d на контролера"
msgid "Pressure:"
msgstr "Налягане:"
msgid "canceled"
msgstr "отменен"
@ -135,8 +181,27 @@ msgstr "докоснат"
msgid "released"
msgstr "пуснат"
msgid "Screen %s at (%s) with %s touch points"
msgstr "Екран %s на (%s) с %s точки на допир"
msgid ""
"Screen dragged with %s touch points at position (%s) with velocity of (%s)"
msgstr "Екранът е плъзнат с %s точки на допир на позиция (%s) със скорост (%s)"
msgid "Magnify Gesture at (%s) with factor %s"
msgstr "Жест за увеличете на (%s) с фактор %s"
msgid "Pan Gesture at (%s) with delta (%s)"
msgstr "Жест с писалка на (%s) с делта (%s)"
msgid "MIDI Input on Channel=%s Message=%s"
msgstr "MIDI вход на Канал=%s Съобщение=%s"
msgid "Input Event with Shortcut=%s"
msgstr "Входящо Събитие с пряк път=%s"
msgid "Accept"
msgstr "Потвърждаване"
msgstr "Приеми"
msgid "Select"
msgstr "Избери"
@ -145,10 +210,10 @@ msgid "Cancel"
msgstr "Отказ"
msgid "Focus Next"
msgstr "Фокусиране върху следващото"
msgstr "Фокусирай следващото"
msgid "Focus Prev"
msgstr "Фокусиране върху предишното"
msgstr "Фокусирай предишното"
msgid "Left"
msgstr "Наляво"
@ -168,6 +233,9 @@ msgstr "Страница нагоре"
msgid "Page Down"
msgstr "Страница надолу"
msgid "Home"
msgstr "Начало"
msgid "End"
msgstr "Край"
@ -186,6 +254,9 @@ msgstr "Отмяна"
msgid "Redo"
msgstr "Повторение"
msgid "Completion Query"
msgstr "Заявка за завършване"
msgid "New Line"
msgstr "Нов ред"
@ -201,6 +272,15 @@ msgstr "Увеличаване на отстъпа"
msgid "Dedent"
msgstr "Намаляване на отстъпа"
msgid "Backspace"
msgstr "Стъпка Назад"
msgid "Backspace Word"
msgstr "Стъпка назад Дума"
msgid "Backspace all to Left"
msgstr "Стъпка назад всички Наляво"
msgid "Delete"
msgstr "Изтриване"
@ -371,6 +451,15 @@ msgstr "Добавяне"
msgid "Action"
msgstr "Действие"
msgid "Name:"
msgstr "Име:"
msgid "Type:"
msgstr "Тип:"
msgid "Metadata name must be a valid identifier."
msgstr "Името на мета-данните трябва да бъде правилен идентификатор."
msgid "Time:"
msgstr "Време:"
@ -459,9 +548,6 @@ msgstr "Мащаб:"
msgid "Blend Shape:"
msgstr "Форма за смесване:"
msgid "Type:"
msgstr "Тип:"
msgid "(Invalid, expected type: %s)"
msgstr "(Неправилно, очакван тип: %s)"
@ -628,9 +714,6 @@ msgstr "Показване само на пътечките на обектит
msgid "Group tracks by node or display them as plain list."
msgstr "Групиране на пътечките по обект, или показване като общ списък."
msgid "Snap:"
msgstr "Прилепване:"
msgid "Animation step value."
msgstr "Стойност за стъпката на анимацията."
@ -682,6 +765,12 @@ msgstr "Изберете пътечки за копиране"
msgid "Select All/None"
msgstr "Избиране на всичко/нищо"
msgid "Close"
msgstr "Затваряне"
msgid "Error!"
msgstr "Грешка!"
msgid "Add Audio Track Clip"
msgstr "Добавяне на звукова пътечка"
@ -776,9 +865,6 @@ msgstr "Метод-получател:"
msgid "Cannot connect signal"
msgstr "Сигналът не може да бъде свързан"
msgid "Close"
msgstr "Затваряне"
msgid "Connect"
msgstr "Свързване"
@ -854,12 +940,12 @@ msgstr "Дебъгер"
msgid "Debug"
msgstr "Дебъгване"
msgid "Value"
msgstr "Стойност"
msgid "Clear"
msgstr "Изчистване"
msgid "Value"
msgstr "Стойност"
msgid "Frame Time (ms)"
msgstr "Продължителност на кадъра (мсек)"
@ -1048,12 +1134,6 @@ msgstr "Наистина ли искате да изтриете %d елемен
msgid "Show Dependencies"
msgstr "Показване на зависимостите"
msgid "Could not create folder."
msgstr "Папката не може да бъде създадена."
msgid "Create Folder"
msgstr "Създаване на папка"
msgid "Thanks from the Godot community!"
msgstr "Благодарности от общността на Godot!"
@ -1360,17 +1440,14 @@ msgstr "(стойност)"
msgid "Editor"
msgstr "Редактор"
msgid "Signal:"
msgstr "Сигнал:"
msgid "Show in FileSystem"
msgstr "Показване във файловата система"
msgid "%d matches."
msgstr "%d съвпадения."
msgid "Open in File Manager"
msgstr "Отваряне във файловия мениджър"
msgid "Method"
msgstr "Метод"
msgid "Signal"
msgstr "Сигнал"
msgid "Class"
msgstr "Клас"
msgid "Constant"
msgstr "Константа"
@ -1381,9 +1458,21 @@ msgstr "Свойство"
msgid "Theme Property"
msgstr "Свойство на тема"
msgid "Method"
msgstr "Метод"
msgid "Signal"
msgstr "Сигнал"
msgid "Annotation"
msgstr "Анотация"
msgid "File"
msgstr "Файл"
msgid "%d matches."
msgstr "%d съвпадения."
msgid "Search Help"
msgstr "Търсене в помощната информация"
@ -1414,9 +1503,6 @@ msgstr "Само свойства"
msgid "Theme Properties Only"
msgstr "Само свойства на теми"
msgid "Class"
msgstr "Клас"
msgid "Move Up"
msgstr "Преместване нагоре"
@ -1429,11 +1515,8 @@ msgstr "Преоразмеряване на масива…"
msgid "Resize Array"
msgstr "Преоразмеряване на масива"
msgid "Metadata name must be a valid identifier."
msgstr "Името на мета-данните трябва да бъде правилен идентификатор."
msgid "Name:"
msgstr "Име:"
msgid "Favorites"
msgstr "Любими"
msgid "Copy Property Path"
msgstr "Копиране на пътя на свойството"
@ -1512,21 +1595,9 @@ msgstr "Запазване на всички сцени"
msgid "Apply MeshInstance Transforms"
msgstr "Прилагане на трансформациите на MeshInstance"
msgid "Quick Open..."
msgstr "Бързо отваряне..."
msgid "Quick Open Scene..."
msgstr "Бързо отваряне на сцена..."
msgid "Quick Open Script..."
msgstr "Бързо отваряне на скрипт…"
msgid "Save Scene As..."
msgstr "Запазване на сцената като..."
msgid "Current scene not saved. Open anyway?"
msgstr "Текущата сцена не е запазена. Отваряне въпреки това?"
msgid "Can't undo while mouse buttons are pressed."
msgstr "Отмяната е невъзможна, докато бутоните на мишката са натиснати."
@ -1620,34 +1691,6 @@ msgstr "Сцената „%s“ има нарушени зависимости:"
msgid "Clear Recent Scenes"
msgstr "Изчистване на последните сцени"
msgid ""
"No main scene has ever been defined, select one?\n"
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
"Няма определена главна сцена. Искате ли да изберете такава сега?\n"
"Можете да промените това по всяко време в „Настройките на проекта“, в "
"категорията „Приложение“."
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 ""
"Избраната сцена „%s“ не съществува. Искате ли да изберете друга?\n"
"Можете да промените това по всяко време в „Настройките на проекта“, в "
"категорията „Приложение“."
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 ""
"Избраната сцена „%s“ не е файл съдържащ сцена. Искате ли да изберете подходящ "
"файл?\n"
"Можете да промените това по всяко време в „Настройките на проекта“, в "
"категорията „Приложение“."
msgid "Save & Close"
msgstr "Запазване и затваряне"
@ -1684,6 +1727,15 @@ msgstr "Повторно отваряне на затворена сцена"
msgid "Save Scene"
msgstr "Запазване на сцената"
msgid "Quick Open..."
msgstr "Бързо отваряне..."
msgid "Quick Open Scene..."
msgstr "Бързо отваряне на сцена..."
msgid "Quick Open Script..."
msgstr "Бързо отваряне на скрипт…"
msgid "Export As..."
msgstr "Изнасяне като…"
@ -1768,13 +1820,6 @@ msgstr "Пакет с шаблони"
msgid "Export Library"
msgstr "Изнасяне на библиотеката"
msgid ""
"The following files are newer on disk.\n"
"What action should be taken?"
msgstr ""
"Следните файлове са по-нови на диска.\n"
"Кое действие трябва да се предприеме?"
msgid "New Inherited"
msgstr "Нова наследена сцена"
@ -1805,15 +1850,15 @@ msgstr "Зареждане..."
msgid "Save As..."
msgstr "Запазване като..."
msgid "Show in FileSystem"
msgstr "Показване във файловата система"
msgid "Convert to %s"
msgstr "Преобразуване в %s"
msgid "New Script..."
msgstr "Нов скрипт..."
msgid "None"
msgstr "Няма"
msgid "Editor Settings"
msgstr "Настройки на редактора"
@ -1972,6 +2017,9 @@ msgstr ""
"Филтри за изключване на файлове/папки от проекта\n"
"(разделени със запетая, например: *.json, *.txt, docs/*)"
msgid "Godot Project Pack"
msgstr "Проектен пакет на Godot"
msgid "Encryption"
msgstr "Шифроване"
@ -2015,9 +2063,6 @@ msgstr "Изнасяне на всичко…"
msgid "ZIP File"
msgstr "Файл ZIP"
msgid "Godot Project Pack"
msgstr "Проектен пакет на Godot"
msgid "Export templates for this platform are missing:"
msgstr "Шаблоните за изнасяне за тази система липсват:"
@ -2039,27 +2084,21 @@ msgstr "Разглеждане"
msgid "Confirm Path"
msgstr "Потвърждаване на пътя"
msgid "Favorites"
msgstr "Любими"
msgid "Error moving:"
msgstr "Грешка при преместването:"
msgid "Error duplicating:"
msgstr "Грешка при дублирането:"
msgid "Failed to save resource at %s: %s"
msgstr "Ресурсът не може да бъде запазен в %s: %s"
msgid "Failed to load resource at %s: %s"
msgstr "Ресурсът не може да бъде зареден от %s: %s"
msgid "A file or folder with this name already exists."
msgstr "Вече съществува файл или папка с това име."
msgid "Duplicating file:"
msgstr "Дублиране на файла:"
msgid "Create Folder"
msgstr "Създаване на папка"
msgid "New Inherited Scene"
msgstr "Нова сцена наследник"
@ -2090,9 +2129,6 @@ msgstr "Премахване от любимите"
msgid "Reimport"
msgstr "Повторно внасяне"
msgid "Open in File Manager"
msgstr "Отваряне във файловия мениджър"
msgid "New Folder..."
msgstr "Нова папка..."
@ -2177,12 +2213,6 @@ msgstr "Избиране на текущата папка"
msgid "Select This Folder"
msgstr "Избиране на тази папка"
msgid "All Recognized"
msgstr "Всички разпознати"
msgid "All Files (*)"
msgstr "Всички файлове (*)"
msgid "Open a File"
msgstr "Отваряне на файл"
@ -2198,6 +2228,9 @@ msgstr "Отваряне на файл или папка"
msgid "Save a File"
msgstr "Запазване на файл"
msgid "Could not create folder."
msgstr "Папката не може да бъде създадена."
msgid "Toggle Hidden Files"
msgstr "Превключване на скритите файлове"
@ -2219,12 +2252,12 @@ msgstr "Опресняване на файловете."
msgid "(Un)favorite current folder."
msgstr "Добавяне/премахване на текущата папка в любимите."
msgid "Toggle the visibility of hidden files."
msgstr "Превключване на видимостта на скритите файлове."
msgid "Directories & Files:"
msgstr "Папки и файлове:"
msgid "Toggle the visibility of hidden files."
msgstr "Превключване на видимостта на скритите файлове."
msgid "File:"
msgstr "Файл:"
@ -2240,8 +2273,8 @@ msgstr "Пускане на персонализирана сцена."
msgid "Reload the played scene."
msgstr "Презареждане на пуснатата сцена."
msgid "Quick Run Scene..."
msgstr "Бързо пускане на сцена..."
msgid "Network Profiler"
msgstr "Профилиране на мрежата"
msgid "Run Project"
msgstr "Пускане на проекта"
@ -2412,15 +2445,9 @@ msgstr "Управление на свойствата на обекта."
msgid "This cannot be undone. Are you sure?"
msgstr "Това действие е необратимо. Наистина ли го искате?"
msgid "Add %d Translations"
msgstr "Добавяне на %d превода"
msgid "Remove Translation"
msgstr "Премахване на превода"
msgid "Add %d file(s) for POT generation"
msgstr "Добавяне на %d файл(а) за създаване на POT"
msgid "Remove file from POT generation"
msgstr "Премахване на файла от процеса за създаване на POT"
@ -2771,19 +2798,6 @@ msgstr "Дублиране на анимацията"
msgid "Change Blend Time"
msgstr "Промяна на времето на смесване"
msgid "Play selected animation backwards from current pos. (A)"
msgstr ""
"Възпроизвеждане на избраната анимация наобратно от текущата позиция. (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Възпроизвеждане на избраната анимация наобратно от края. (Shift+A)"
msgid "Play selected animation from start. (Shift+D)"
msgstr "Възпроизвеждане на избраната анимация от началото. (Shift+D)"
msgid "Play selected animation from current pos. (D)"
msgstr "Възпроизвеждане на избраната анимация от текущата позиция. (D)"
msgid "Animation position (in seconds)."
msgstr "Позиция в анимацията (в секунди)."
@ -2845,9 +2859,6 @@ msgstr "Принудително модулиране на бялото"
msgid "Pin AnimationPlayer"
msgstr "Закачане на AnimationPlayer"
msgid "Error!"
msgstr "Грешка!"
msgid "Cross-Animation Blend Times"
msgstr "Времена на смесване между анимациите"
@ -3244,9 +3255,6 @@ msgstr "По средата долу"
msgid "Bottom Right"
msgstr "Долу вдясно"
msgid "Create Emission Points From Node"
msgstr "Създаване на излъчващи точки от обекта"
msgid "Edit Plugin"
msgstr "Редактиране на приставката"
@ -3256,36 +3264,6 @@ msgstr "Инсталирани приставки:"
msgid "Version"
msgstr "Версия"
msgid " - Variation"
msgstr " Вариация"
msgid "Convert to CPUParticles2D"
msgstr "Преобразуване в CPUParticles2D"
msgid "The geometry doesn't contain any faces."
msgstr "Геометрията не съдържа страни."
msgid "\"%s\" doesn't contain geometry."
msgstr "„%s“ не съдържа геометрия."
msgid "\"%s\" doesn't contain face geometry."
msgstr "„%s“ не съдържа геометрия със страни."
msgid "Emission Points:"
msgstr "Излъчващи точки:"
msgid "Surface Points"
msgstr "Точки на повърхността"
msgid "Surface Points+Normal (Directed)"
msgstr "Точки на повърхността + нормали (насочени)"
msgid "Volume"
msgstr "Обем"
msgid "Emission Source:"
msgstr "Източник на излъчването:"
msgid ""
"Can't determine a save path for lightmap images.\n"
"Save your scene and try again."
@ -3294,11 +3272,6 @@ msgstr ""
"осветеност.\n"
"Запазете сцената и опитайте отново."
msgid "Failed creating lightmap images, make sure path is writable."
msgstr ""
"Грешка при създаването на изображения с карти на осветеност. Уверете се, че "
"пътят е достъпен за запис."
msgid "Bake Lightmaps"
msgstr "Изпичане на карти на осветеност"
@ -3315,9 +3288,6 @@ msgstr "Не могат да бъдат създадени никакви фор
msgid "Mesh is empty!"
msgstr "Полигонната мрежа е празна!"
msgid "Create Navigation Mesh"
msgstr "Създаване на навигационна полигонна мрежа"
msgid "Contained Mesh is not of type ArrayMesh."
msgstr "Съдържащата се полигонна мрежа не е от тип ArrayMesh."
@ -3329,6 +3299,9 @@ msgstr ""
msgid "No mesh to debug."
msgstr "Няма полигонна мрежа за дебъгване."
msgid "Create Navigation Mesh"
msgstr "Създаване на навигационна полигонна мрежа"
msgid "MeshInstance3D lacks a Mesh."
msgstr "В MeshInstance3D няма полигонна мрежа."
@ -3403,9 +3376,15 @@ msgstr "Източник за полигонна мрежа:"
msgid "Mesh Up Axis:"
msgstr "Ос сочеща нагоре за полигонната мрежа:"
msgid "Please Confirm..."
msgstr "Моля, потвърдете..."
msgid "Objects: %d\n"
msgstr "Обекти: %d\n"
msgid "Translating:"
msgstr "Транслиране:"
msgid "Top View."
msgstr "Изглед отгоре."
@ -3430,18 +3409,12 @@ msgstr "Подравняване на трансформацията с изгл
msgid "Align Rotation with View"
msgstr "Подравняване на ротацията с изгледа"
msgid "None"
msgstr "Няма"
msgid "Rotate"
msgstr "Ротация"
msgid "Translate"
msgstr "Транслиране"
msgid "Translating:"
msgstr "Транслиране:"
msgid "Rotating %s degrees."
msgstr "Завъртане на %s градуса."
@ -3665,12 +3638,39 @@ msgstr "Прилепване при скалиране (%):"
msgid "Viewport Settings"
msgstr "Настройки на прозореца за изглед"
msgid "Convert to CPUParticles2D"
msgstr "Преобразуване в CPUParticles2D"
msgid "\"%s\" doesn't contain geometry."
msgstr "„%s“ не съдържа геометрия."
msgid "\"%s\" doesn't contain face geometry."
msgstr "„%s“ не съдържа геометрия със страни."
msgid "Create Emission Points From Node"
msgstr "Създаване на излъчващи точки от обекта"
msgid "The geometry doesn't contain any faces."
msgstr "Геометрията не съдържа страни."
msgid "Emission Points:"
msgstr "Излъчващи точки:"
msgid "Surface Points"
msgstr "Точки на повърхността"
msgid "Surface Points+Normal (Directed)"
msgstr "Точки на повърхността + нормали (насочени)"
msgid "Volume"
msgstr "Обем"
msgid "Emission Source:"
msgstr "Източник на излъчването:"
msgid "Delete Point"
msgstr "Изтриване на точка"
msgid "Please Confirm..."
msgstr "Моля, потвърдете..."
msgid "Move Joint"
msgstr "Преместване на ставата"
@ -3802,9 +3802,6 @@ msgstr "Следващ скрипт"
msgid "Previous Script"
msgstr "Предишен скрипт"
msgid "File"
msgstr "Файл"
msgid "Open..."
msgstr "Отваряне…"
@ -4024,6 +4021,19 @@ msgstr "Изтриване на анимацията"
msgid "Animation Frames:"
msgstr "Кадри на анимацията:"
msgid "Play selected animation backwards from current pos. (A)"
msgstr ""
"Възпроизвеждане на избраната анимация наобратно от текущата позиция. (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Възпроизвеждане на избраната анимация наобратно от края. (Shift+A)"
msgid "Play selected animation from start. (Shift+D)"
msgstr "Възпроизвеждане на избраната анимация от началото. (Shift+D)"
msgid "Play selected animation from current pos. (D)"
msgstr "Възпроизвеждане на избраната анимация от текущата позиция. (D)"
msgid "Zoom Reset"
msgstr "Връщане на оригиналния мащаб"
@ -4033,6 +4043,9 @@ msgstr "Избиране на кадри"
msgid "Size"
msgstr "Размер"
msgid "Auto Slice"
msgstr "Автоматично отрязване"
msgid "Reload"
msgstr "Презареждане"
@ -4051,9 +4064,6 @@ msgstr "Прилепване към пикселите"
msgid "Grid Snap"
msgstr "Прилепване към решетката"
msgid "Auto Slice"
msgstr "Автоматично отрязване"
msgid "Step:"
msgstr "Стъпка:"
@ -4592,15 +4602,6 @@ msgstr "Посоченият път не съществува."
msgid "New Game Project"
msgstr "Нов игрален проект"
msgid "Import & Edit"
msgstr "Внасяне и редактиране"
msgid "Create & Edit"
msgstr "Създаване и редактиране"
msgid "Install & Edit"
msgstr "Инсталиране и редактиране"
msgid "Project Name:"
msgstr "Име на проекта:"
@ -4828,23 +4829,11 @@ msgstr "Неправилен базов път."
msgid "Wrong extension chosen."
msgstr "Избрано е грешно разширение."
msgid "Next Plane"
msgstr "Следваща равнина"
msgid "Previous Plane"
msgstr "Предходна равнина"
msgid "Plane:"
msgstr "Равнина:"
msgid "Next Floor"
msgstr "Следващ под"
msgid "Previous Floor"
msgstr "Предходен под"
msgid "Floor:"
msgstr "Под:"
msgid "Next Floor"
msgstr "Следващ под"
msgid "Edit X Axis"
msgstr "Редактиране на оста X"
@ -4855,18 +4844,6 @@ msgstr "Редактиране на оста Y"
msgid "Edit Z Axis"
msgstr "Редактиране на оста Z"
msgid "Paste Selects"
msgstr "Поставяне на избраното"
msgid "Cut Selection"
msgstr "Изрязване на избраното"
msgid "Clear Selection"
msgstr "Изчистване на избраното"
msgid "Fill Selection"
msgstr "Запълване на избраното"
msgid "GridMap Settings"
msgstr "Настройки на GridMap"
@ -4881,9 +4858,6 @@ msgstr "Недостатъчно байтове за разкодиране ил
msgid "Config"
msgstr "Конфигурация"
msgid "Network Profiler"
msgstr "Профилиране на мрежата"
msgid "Not possible to add a new property to synchronize without a root."
msgstr "Добавянето на ново свойство за синхронизиране без корен е невъзможно."
@ -4956,26 +4930,12 @@ msgstr "Липсва папката „build-tools“!"
msgid "Unable to find Android SDK build-tools' apksigner command."
msgstr "Не е намерена командата „apksigner “ от Android SDK build-tools."
msgid ""
"'apksigner' could not be found. Please check that the command is available in "
"the Android SDK build-tools directory. The resulting %s is unsigned."
msgstr ""
"Командата „apksigner“ не може да бъде намерена. Проверете дали командата е "
"налична в папката „build-tools“ на Android SDK. Резултатният файл „%s“ не е "
"подписан."
msgid "Could not find keystore, unable to export."
msgstr "Не е намерено хранилище за ключове. Изнасянето е невъзможно."
msgid "'apksigner' returned with error #%d"
msgstr "„apksigner“ завърши с грешка #%d"
msgid "Verifying %s..."
msgstr "Потвърждаване на %s..."
msgid "'apksigner' verification of %s failed."
msgstr "Проверката на %s от „apksigner“ беше неуспешна."
msgid "Exporting for Android"
msgstr "Изнасяне за Android"
@ -4997,9 +4957,6 @@ msgstr "Компилиране на проект за Android (gradle)"
msgid "Moving output"
msgstr "Преместване на изходящите данни"
msgid "Package not found: \"%s\"."
msgstr "Пакетът не е намерен: „%s“."
msgid "Creating APK..."
msgstr "Създаване на APK…"

View File

@ -16,13 +16,13 @@
# Safuan <safuanhossain12616@gmail.com>, 2023.
# Zayeed Bin Syed <zayeed.dev@gmail.com>, 2023.
# Rakib Ryan <rakib.remon12@gmail.com>, 2024.
# shahriarlabib000 <shahriarlabib000@gmail.com>, 2024.
# shahriarlabib000 <shahriarlabib000@gmail.com>, 2024, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor interface\n"
"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2024-08-24 11:09+0000\n"
"PO-Revision-Date: 2025-02-02 17:03+0000\n"
"Last-Translator: shahriarlabib000 <shahriarlabib000@gmail.com>\n"
"Language-Team: Bengali <https://hosted.weblate.org/projects/godot-engine/"
"godot/bn/>\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 5.7.1-dev\n"
"X-Generator: Weblate 5.10-dev\n"
msgid "Main Thread"
msgstr "প্রধান থ্রেড"
@ -491,6 +491,24 @@ msgstr "Action"
msgid "Deadzone"
msgstr "মৃতস্থান"
msgid "Name:"
msgstr "নাম:"
msgid "Type:"
msgstr "ধরণ:"
msgid "Metadata name is valid."
msgstr "মেটাডেটা নাম বৈধ।"
msgid "Add Metadata Property for \"%s\""
msgstr "\"%s\" এর জন্য মেটাডেটা প্রপার্টি যোগ করুন"
msgid "Metadata name must be a valid identifier."
msgstr "মেটাডেটা নাম অবশ্যই একটি বৈধ শনাক্তকারী হতে হবে।"
msgid "Metadata with name \"%s\" already exists."
msgstr "\"%s\" নামের মেটাডেটা ইতিমধ্যেই বিদ্যমান।"
msgid "Time:"
msgstr "সময়:"
@ -605,13 +623,6 @@ msgstr "অ্যানিমেশনের ব্যাপ্তিকাল
msgid "Change Animation Loop"
msgstr "অ্যানিমেশনের লুপ পরিবর্তন করুন"
msgid "Can't change loop mode on animation instanced from imported scene."
msgstr ""
"আমদানি করা দৃশ্য থেকে উদাহরণ দেওয়া অ্যানিমেশনে লুপ মোড পরিবর্তন করা যাচ্ছে না।"
msgid "Can't change loop mode on animation embedded in another scene."
msgstr "অন্য দৃশ্যে এম্বেড থাকা অ্যানিমেশনে লুপ মোড পরিবর্তন করা যাচ্ছে না।"
msgid "Property Track..."
msgstr "বৈশিষ্ট্য ট্র্যাক…"
@ -696,9 +707,6 @@ msgstr "স্কেল/মাপ:"
msgid "Blend Shape:"
msgstr "ব্লেন্ড/মিশ্রণ আকার:"
msgid "Type:"
msgstr "ধরণ:"
msgid "(Invalid, expected type: %s)"
msgstr "(অগ্রহণযোগ্য, প্রত্যাশিত type %s)"
@ -931,9 +939,6 @@ msgstr "Tree মধ্যে নির্বাচিত নোডগুলি
msgid "Group tracks by node or display them as plain list."
msgstr "নোড দ্বারা গ্রুপ ট্র্যাক করুন বা তাদের সরল তালিকা হিসাবে প্রদর্শন করুন।"
msgid "Snap:"
msgstr "স্ন্যাপ :"
msgid "Animation step value."
msgstr "অ্যানিমেশন পদক্ষেপের মান।"
@ -1024,6 +1029,12 @@ msgstr "গুণাগুণ/বৈশিষ্ট্য copy করুন"
msgid "Select All/None"
msgstr "কোনোটাই নির্বাচন করবেন/না"
msgid "Close"
msgstr "বন্ধ করুন"
msgid "Error!"
msgstr "ভুল/সমস্যা!"
msgid "Add Audio Track Clip"
msgstr "অডিও ট্র্যাক ক্লিপ যুক্ত করুন"
@ -1133,9 +1144,6 @@ msgstr "বিলম্বিত"
msgid "Cannot connect signal"
msgstr "সিগন্যাল কানেক্ট করা যায়নি"
msgid "Close"
msgstr "বন্ধ করুন"
msgid "Connect"
msgstr "সংযোগ"
@ -1217,6 +1225,9 @@ msgstr "প্রশাখাকে দৃশ্য হিসেবে সংর
msgid "Instance:"
msgstr "ইন্সট্যান্স:"
msgid "Clear"
msgstr "পরিস্কার করুন/ক্লীয়ার"
msgid "Scanning for local changes"
msgstr "স্থানীয় পরিবর্তন-সমূহ খোঁজা হচ্ছে"
@ -1241,9 +1252,6 @@ msgstr "থামো"
msgid "Start"
msgstr "শুরু"
msgid "Clear"
msgstr "পরিস্কার করুন/ক্লীয়ার"
msgid "Measure:"
msgstr "মাপ:"
@ -1451,17 +1459,17 @@ msgstr "আয়ত্তে"
msgid "Resources Without Explicit Ownership:"
msgstr "স্পষ্ট মালিকানা বিহীন রিসোর্সসমূহ:"
msgid "Name cannot be empty."
msgstr "নাম খালি রাখা যাবে না।"
msgid "Folder name cannot be empty."
msgstr "ফোল্ডার নাম ফাঁকা হতে পারে না।"
msgid "Folder name contains invalid characters."
msgstr "ব্যবহৃত নামে অগ্রহণযোগ্য অক্ষর বিদ্যমান।"
msgid "Folder name cannot begin or end with a space."
msgstr "ফোল্ডার নামের শুরুতে কিংবা শেষে স্পেস থাকতে পারে না।"
msgid "Folder name cannot begin with a dot."
msgstr "ফোল্ডার নাম ডট দিয়ে শুরু হতে পারে না।"
msgid "File name begins with a dot."
msgstr "ফাইলের নাম একটি বিন্দু দিয়ে শুরু হয়।"
msgid "File with that name already exists."
msgstr "একই নামের ফাইল রয়েছে।"
@ -1469,15 +1477,6 @@ msgstr "একই নামের ফাইল রয়েছে।"
msgid "Folder with that name already exists."
msgstr "একই নামের ফোল্ডার রয়েছে।"
msgid "Could not create folder."
msgstr "ফোল্ডার তৈরী করা সম্ভব হয়নি।"
msgid "Create new folder in %s:"
msgstr "%s এ নতুন ফোল্ডার তৈরি করুন:"
msgid "Create Folder"
msgstr "ফোল্ডার তৈরি করুন"
msgid "Folder name is valid."
msgstr "ফোল্ডার নামটি গ্রহণযোগ্য।"
@ -1616,15 +1615,12 @@ msgstr "নতুন লেআউট লোকেশন..."
msgid "Open Audio Bus Layout"
msgstr "অডিও বাস লেআউট ওপেন করুন"
msgid "Layout:"
msgstr "লেআউট/নকশা সংরক্ষণ করুন:"
msgid "Invalid file, not an audio bus layout."
msgstr "ফাইল অডিও বাস লেআউট হিসেবে ব্যাবহারযোগ্য নয়।"
msgid "Error saving file: %s"
msgstr "ফাইল সংরক্ষণে সমস্যা: %s"
msgid "Layout:"
msgstr "লেআউট/নকশা সংরক্ষণ করুন:"
msgid "Add Bus"
msgstr "বাস যোগ করুন"
@ -1649,9 +1645,6 @@ msgstr "ডিফল্ট বাস লেআউট লোড করুন।"
msgid "Create a new Bus Layout."
msgstr "নতুন বাস লেআউট তৈরি করুন।"
msgid "Cannot begin with a digit."
msgstr "ডিজিট দিয়ে শুরু করা যাবে না।"
msgid "Autoload '%s' already exists!"
msgstr "'%s' এর AutoLoad ইতিমধ্যেই বিদ্যমান!"
@ -1718,6 +1711,9 @@ msgstr "সংরক্ষন করুন"
msgid "Profile:"
msgstr "প্রোফাইল:"
msgid "Detect from Project"
msgstr "প্রজেক্ট থেকে শনাক্ত করুন"
msgid "Configure Engine Compilation Profile:"
msgstr "ইঞ্জিন কম্পাইলেশন প্রোফাইল কনফিগার:"
@ -1871,23 +1867,8 @@ msgstr ""
msgid "No description available."
msgstr "বর্ণনা নেই।"
msgid "Setting:"
msgstr "সেটিংস:"
msgid "Property:"
msgstr "প্রপার্টি:"
msgid "%d match."
msgstr "%d মিল।"
msgid "%d matches."
msgstr "%d টি মিলছে।"
msgid "Constructor"
msgstr "কনস্ট্রাক্টর"
msgid "Method"
msgstr "মেথড"
msgid "Class"
msgstr "ক্লাস"
msgid "Constant"
msgstr "ধ্রুবক/কন্সট্যান্ট"
@ -1898,9 +1879,24 @@ msgstr "প্রপার্টি"
msgid "Theme Property"
msgstr "থিম প্রোপার্টি-সমূহ"
msgid "Method"
msgstr "মেথড"
msgid "Annotation"
msgstr "টীকা"
msgid "File"
msgstr "ফাইল"
msgid "%d match."
msgstr "%d মিল।"
msgid "%d matches."
msgstr "%d টি মিলছে।"
msgid "Constructor"
msgstr "কনস্ট্রাক্টর"
msgid "Search Help"
msgstr "সাহায্য অনুসন্ধান করুন"
@ -1928,12 +1924,6 @@ msgstr "শুধু থিম প্রোপার্টি-সমূহ"
msgid "Member Type"
msgstr "সদস্য টাইপ"
msgid "(constructors)"
msgstr "(কনস্ট্রাকটর)"
msgid "Class"
msgstr "ক্লাস"
msgid "(%d change)"
msgid_plural "(%d changes)"
msgstr[0] "(%d টি পরিবর্তন)"
@ -1960,20 +1950,8 @@ msgstr "একাধিক পরিবর্তন:%s"
msgid "Remove metadata %s"
msgstr "মেটাডেটা %s সরান"
msgid "Metadata name must be a valid identifier."
msgstr "মেটাডেটা নাম অবশ্যই একটি বৈধ শনাক্তকারী হতে হবে।"
msgid "Metadata with name \"%s\" already exists."
msgstr "\"%s\" নামের মেটাডেটা ইতিমধ্যেই বিদ্যমান।"
msgid "Name:"
msgstr "নাম:"
msgid "Metadata name is valid."
msgstr "মেটাডেটা নাম বৈধ।"
msgid "Add Metadata Property for \"%s\""
msgstr "\"%s\" এর জন্য মেটাডেটা প্রপার্টি যোগ করুন"
msgid "Favorites"
msgstr "ফেবরিট"
msgid "Thumbnail..."
msgstr "থাম্বনেইল..."
@ -2075,18 +2053,9 @@ msgstr "পরিবর্তন হারিয়ে যেতে পারে
msgid "Open Base Scene"
msgstr "গোড়ার দৃশ্য খুলুন"
msgid "Quick Open Scene..."
msgstr "দ্রুত দৃশ্য খুলুন..."
msgid "Quick Open Script..."
msgstr "দ্রুত স্ক্রিপ্ট খুলুন..."
msgid "Save Scene As..."
msgstr "দৃশ্য এইরূপে সংরক্ষণ করুন..."
msgid "Current scene not saved. Open anyway?"
msgstr "বর্তমান দৃশ্যটি সংরক্ষিত হয়নি। তবুও খুলবেন?"
msgid "Global Undo: %s"
msgstr "বিশ্বব্যাপী পূর্বাবস্থায় ফেরান: %s"
@ -2148,25 +2117,6 @@ msgstr ""
msgid "Scene '%s' has broken dependencies:"
msgstr "'%s' দৃশ্যটির অসংলগ্ন নির্ভরতা রয়েছে:"
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 ""
"নির্বাচিত '%s' দৃশ্যটি বিদ্যমান নয়, একটি কার্যকর দৃশ্য নির্ধারণ করবেন?\n"
"আপনি পরবর্তিতে তা 'অ্যাপ্লিকেশন (application)' বিভাগের \\\"প্রকল্পের সেটিংস "
"(Project Settings)\\\"-এ পরিবর্তন করতে পারবেন।"
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 ""
"নির্বাচিত '%s' দৃশ্যটি কোনো দৃশ্যের ফাইল নয়, একটি কার্যকর দৃশ্যের ফাইল নির্ধারণ "
"করবেন?\n"
"আপনি পরবর্তিতে তা 'অ্যাপ্লিকেশন (application)' বিভাগের \\\"প্রকল্পের সেটিংস "
"(Project Settings)\\\"-এ পরিবর্তন করতে পারবেন।"
msgid "Save Layout..."
msgstr "লেআউট সংরক্ষণ করুন…"
@ -2203,9 +2153,6 @@ msgstr "পুনরায় লোড করা হয়েছে।"
msgid "(Overridden)"
msgstr "(ওভাররিডেন)"
msgid "Restart Emission"
msgstr "নির্গমন পুনরায় চালু করুন"
msgid "Distraction Free Mode"
msgstr "বিক্ষেপ-হীন মোড"
@ -2236,6 +2183,12 @@ msgstr "সাম্প্রতিকসমূহ খুলুন"
msgid "Save Scene"
msgstr "দৃশ্য সংরক্ষণ করুন"
msgid "Quick Open Scene..."
msgstr "দ্রুত দৃশ্য খুলুন..."
msgid "Quick Open Script..."
msgstr "দ্রুত স্ক্রিপ্ট খুলুন..."
msgid "Export As..."
msgstr "রপ্তানি করুন…"
@ -2251,9 +2204,15 @@ msgstr "প্রস্থান করুন"
msgid "Editor Settings..."
msgstr "এডিটরের সেটিংস…"
msgid "Project"
msgstr "প্রজেক্ট"
msgid "Project Settings..."
msgstr "প্রকল্পের সেটিংস…"
msgid "Project Settings"
msgstr "প্রজেক্ট সেটিংস"
msgid "Version Control"
msgstr "ভার্সন কন্ট্রোল"
@ -2266,6 +2225,9 @@ msgstr "সরঞ্জাম-সমূহ"
msgid "Orphan Resource Explorer..."
msgstr "মালিকবিহীন রিসোর্সের অনুসন্ধানকারী…"
msgid "Reload Current Project"
msgstr "বর্তমানের প্রজেক্ট রিলোড করুন"
msgid "Quit to Project List"
msgstr "প্রকল্পের তালিকায় প্রস্থান করুন"
@ -2326,16 +2288,6 @@ msgstr "লাইব্রেরি এক্সপোর্ট করুন"
msgid "Open & Run a Script"
msgstr "একটি স্ক্রিপ্ট খুলুন এবং চালান"
msgid ""
"The following files are newer on disk.\n"
"What action should be taken?"
msgstr ""
"নিম্নোক্ত ফাইলসমূহ ডিস্কে নতুনতর।\n"
"কোন সিধান্তটি নেয়া উচিত হবে?"
msgid "Discard local changes and reload"
msgstr "স্থানীয় পরিবর্তন বাতিল করুন এবং পুনরায় লোড করুন"
msgid "Create/Override Version Control Metadata..."
msgstr "সংস্করণ নিয়ন্ত্রণ মেটাডেটা তৈরি/ওভাররাইড করুন..।"
@ -2384,9 +2336,6 @@ msgstr "বাছাইকৃত নোড ভিউপোর্ট নয়!"
msgid "Remove Item"
msgstr "বস্তু অপসারণ করুন"
msgid "Dictionary (Nil)"
msgstr "ডিকশনারি (নিল)"
msgid "Localizable String (size %d)"
msgstr "স্থানীয়করণযোগ্য স্ট্রিং (আকার %d)"
@ -2411,8 +2360,8 @@ msgstr "স্ক্রীপ্ট বাড়ান…"
msgid "New Shader..."
msgstr "নতুন শেডার…"
msgid "Run 'Remote Debug' anyway?"
msgstr "যাইহোক 'রিমোট ডিবাগ' চালান?"
msgid "Project Run"
msgstr "প্রজেক্ট রান করুন"
msgid "Write your logic in the _run() method."
msgstr "আপনার লজিক/যুক্তি-সমূহ _run() মেথডে লিখুন।"
@ -2462,6 +2411,9 @@ msgstr "অবৈধ এনটাইটেলমেন্ট ফাইল।"
msgid "Invalid executable file."
msgstr "অবৈধ এক্সিকিউটেবল ফাইল।"
msgid "Project export for platform:"
msgstr "প্লাটফর্মসমূহের জন্য প্রজেক্ট এক্সপোর্ট:"
msgid "Completed with warnings."
msgstr "সতর্কবাণীসহ সম্পন্ন হয়েছে।"
@ -2556,18 +2508,15 @@ msgstr "এক্সপোর্ট টেমপ্লেট ফাইলের
msgid "Importing:"
msgstr "ইম্পোর্ট হচ্ছে:"
msgid "Current Version:"
msgstr "বর্তমান ভার্সন:"
msgid "Export templates are missing. Install them from a file."
msgstr "রপ্তানি টেমপ্লেট অনুপস্থিত । একটি ফাইল থেকে তাদের ইনস্টল করুন।"
msgid "Current Version:"
msgstr "বর্তমান ভার্সন:"
msgid "Download from:"
msgstr "ডাউনলোড সোর্স:"
msgid "(no templates for development builds)"
msgstr "(উন্নয়নের জন্য কোন টেমপ্লেট নেই)"
msgid "Install from File"
msgstr "ফাইল থেকে ইন্সটল করুন"
@ -2680,9 +2629,6 @@ msgstr "FBX2glTF এক্সিকিউটেবল বৈধ।"
msgid "Browse"
msgstr "ব্রাউস"
msgid "Favorites"
msgstr "ফেবরিট"
msgid "View items as a grid of thumbnails."
msgstr "থাম্বনেইল গ্রিড হিসাবে আইটেম দেখুন।"
@ -2697,12 +2643,6 @@ msgstr ""
msgid "Cannot move a folder into itself."
msgstr "ফাইলকে তার নিজের ভেতরেই সরানো যায় না।"
msgid "Failed to save resource at %s: %s"
msgstr "%s এ সম্পদ সংরক্ষণ করতে ব্যর্থ হয়েছে: %s"
msgid "Failed to load resource at %s: %s"
msgstr "%s এ রিসোর্স লোড করতে ব্যর্থ হয়েছে: %s"
msgid "Unable to update dependencies for:"
msgstr "এর জন্য নির্ভরতা আপডেট করতে অক্ষম:"
@ -2715,6 +2655,9 @@ msgstr "ডুপ্লিকেট করা হচ্ছে ফাইল:"
msgid "Duplicating folder:"
msgstr "ফোল্ডার ডুপ্লিকেট করা হচ্ছে:"
msgid "Create Folder"
msgstr "ফোল্ডার তৈরি করুন"
msgid "New Inherited Scene"
msgstr "নতুন উত্তরাধিকারী দৃশ্য"
@ -2859,12 +2802,6 @@ msgstr "টার্গেট ডিরেক্টরি নির্বাচ
msgid "Move"
msgstr "সরান"
msgid "All Recognized"
msgstr "সব ফাইল পরিচিতি সম্পন্ন"
msgid "All Files (*)"
msgstr "সব ফাইল (*)"
msgid "Open a File"
msgstr "একটি ফাইল খুলুন"
@ -2883,6 +2820,9 @@ msgstr "ফাইল সংরক্ষন করুন"
msgid "Could not create folder. File with that name already exists."
msgstr "ফোল্ডার তৈরি করা যায়নি। সেই নামের ফাইলটি আগে থেকেই আছে।"
msgid "Could not create folder."
msgstr "ফোল্ডার তৈরী করা সম্ভব হয়নি।"
msgid "Go Back"
msgstr "পিছনের দিকে যান"
@ -2913,15 +2853,15 @@ msgstr "ফেবরিট/প্রিয়কে নিচের দিকে
msgid "Refresh files."
msgstr "ফাইল রিফ্রেশ করুন।"
msgid "Toggle the visibility of hidden files."
msgstr "লুকানো ফাইলের দৃশ্যমানতা টগল করুন।"
msgid "Create a new folder."
msgstr "নতুন একটি ফোল্ডার তৈরি করুন।"
msgid "Directories & Files:"
msgstr "পথ এবং ফাইল:"
msgid "Toggle the visibility of hidden files."
msgstr "লুকানো ফাইলের দৃশ্যমানতা টগল করুন।"
msgid "Preview:"
msgstr "প্রিভিউ:"
@ -2950,9 +2890,6 @@ msgstr "একটি কাস্টম দৃশ্য প্লে করু
msgid "Reload the played scene."
msgstr "পূর্বে প্লে করা দৃশ্য পুনরায় লোড করুন।"
msgid "Quick Run Scene..."
msgstr "দ্রুত দৃশ্য চালান..."
msgid "Close Other Tabs"
msgstr "অন্য ট্যাবগুলি বন্ধ করুন"
@ -3020,6 +2957,9 @@ msgstr "অগ্রহণযোগ্য নোডের নাম, নীম
msgid "A node with the unique name %s already exists in this scene."
msgstr "এই দৃশ্যে %s নামের অনন্য একটি নোড ইতিমধ্যেই বিদ্যমান।"
msgid "Enable Scene Unique Name(s)"
msgstr "দৃশ্যের অনন্য নাম(গুলি) সক্ষম করুন"
msgid "Scene Tree (Nodes):"
msgstr "দৃশ্যের শাখা (নোডসমূহ):"
@ -3170,18 +3110,9 @@ msgstr "রিসোর্স প্রতিলিপি/কপি করুন
msgid "History of recently edited objects."
msgstr "সাম্প্রতিক সময়ে সম্পাদিত বস্তুর স্মৃতি।"
msgid "Add %d Translations"
msgstr "%d অনুবাদ যোগ করুন"
msgid "Remove Translation"
msgstr "অনুবাদ অপসারণ করুন"
msgid "Translation Resource Remap: Add %d Path(s)"
msgstr "অনুবাদ সম্পদ রিম্যাপ: %d পথ(গুলি) যোগ করুন"
msgid "Translation Resource Remap: Add %d Remap(s)"
msgstr "অনুবাদ সম্পদ রিম্যাপ: %d রিম্যাপ যোগ করুন"
msgid "Change Resource Remap Language"
msgstr "রিসোর্স পুনঃ-নকশার ভাষা পরিবর্তন করুন"
@ -3416,18 +3347,6 @@ msgstr "[গ্লোবাল](তৈরি)"
msgid "Duplicated Animation Name:"
msgstr "অ্যানিমেশন প্রতিলিপির নাম:"
msgid "Play selected animation backwards from current pos. (A)"
msgstr "নির্বাচিত অ্যানিমেশনটি বর্তমান স্থান হতে পিছনের দিকে চালান। (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "নির্বাচিত অ্যানিমেশনটি শেষ হতে পিছনের দিকে চালান। (Shift+A)"
msgid "Play selected animation from start. (Shift+D)"
msgstr "নির্বাচিত অ্যানিমেশনটি শুরু হতে চালান। (Shift+D)"
msgid "Play selected animation from current pos. (D)"
msgstr "নির্বাচিত অ্যানিমেশনটি বর্তমান স্থান হতে চালান। (D)"
msgid "Animation position (in seconds)."
msgstr "অ্যানিমেশনের স্থান (সেকেন্ডে)।"
@ -3458,9 +3377,6 @@ msgstr "দিকনির্দেশ"
msgid "Depth"
msgstr "গভীরতা"
msgid "Error!"
msgstr "ভুল/সমস্যা!"
msgid "Cross-Animation Blend Times"
msgstr "আন্ত-অ্যানিমেশন ব্লেন্ড সময়"
@ -3776,24 +3692,6 @@ msgstr "হ্যান্ডেল স্থাপন করুন"
msgid "Vertical alignment"
msgstr "উল্লম্ব প্রান্তিককরণ"
msgid "Convert to GPUParticles3D"
msgstr "GPUParticles3D তে রূপান্তর করুন"
msgid "Load Emission Mask"
msgstr "Emission Mask লোড করুন"
msgid "Convert to GPUParticles2D"
msgstr "GPUParticles2D তে রূপান্তর করুন"
msgid "Solid Pixels"
msgstr "সলিড পিক্সেল"
msgid "Directed Border Pixels"
msgstr "নির্দেশিত বর্ডার পিক্সেল"
msgid "Generation Time (sec):"
msgstr "তৈরিতে সময় (সেকেন্ড):"
msgid "Hold Shift to edit tangents individually"
msgstr "ট্যানজেন্টগুলি আলাদা ভাবে সম্পাদনা করার জন্য Shift ধরে রাখুন্"
@ -3848,9 +3746,6 @@ msgstr "ভেরিএশন স্থানাঙ্ক (%d)"
msgid "Numeral Alignment"
msgstr "সংখ্যাগত প্রান্তিককরণ"
msgid " - Variation"
msgstr " - ভিন্নতা"
msgid "Change AudioStreamPlayer3D Emission Angle"
msgstr "অডিওস্ট্রিম প্লেয়ার 3 ডি ইমিশন এঙ্গেল পরিবর্তন করুন"
@ -3872,36 +3767,6 @@ msgstr "Capsule Shape এর উচ্চতা পরিবর্তন কর
msgid "Change Light Radius"
msgstr "Light এর ব্যাসার্ধ পরিবর্তন করুন"
msgid "Convert to CPUParticles2D"
msgstr "CPUParticles2D এ রূপান্তর করুন"
msgid "Generate Visibility Rect"
msgstr "ভিজিবিলিটি রেক্ট তৈরি করুন"
msgid "\"%s\" doesn't inherit from Node3D."
msgstr "\"%s\" Node3D থেকে উত্তরাধিকারসূত্রে পাওয়া যায় না।"
msgid "\"%s\" doesn't contain geometry."
msgstr "\"%s\"-এ জ্যামিতি নেই।"
msgid "\"%s\" doesn't contain face geometry."
msgstr "\"%s\"-এ মুখের জ্যামিতি নেই।"
msgid "Create Emitter"
msgstr "Emitter তৈরি করুন"
msgid "Surface Points"
msgstr "সারফেস পয়েন্ট"
msgid "Surface Points+Normal (Directed)"
msgstr "সারফেস পয়েন্ট + নরমাল (নির্দেশিত)"
msgid "Volume"
msgstr "আয়তন"
msgid "Convert to CPUParticles3D"
msgstr "CPUParticles3D এ রূপান্তর করুন"
msgid "Create Occluder Polygon"
msgstr "অকলুডার (occluder) পলিগন তৈরি করুন"
@ -3923,15 +3788,15 @@ msgstr "একটি সরলীকৃত সংঘর্ষের আকৃত
msgid "Mesh is empty!"
msgstr "মেসটি খালি!"
msgid "Create Navigation Mesh"
msgstr "Navigation Mesh তৈরি করুন"
msgid "Create Debug Tangents"
msgstr "ডিবাগ স্পর্শক তৈরি করুন"
msgid "Can't unwrap mesh with blend shapes."
msgstr "মিশ্রিত আকার দিয়ে জাল খুলতে পারবেন না।"
msgid "Create Navigation Mesh"
msgstr "Navigation Mesh তৈরি করুন"
msgid "MeshInstance3D lacks a Mesh."
msgstr "MeshInstance3D-এ Mesh নেই।"
@ -4056,11 +3921,8 @@ msgstr "পরিমাণ:"
msgid "Populate"
msgstr "পপুলেট"
msgid "Edit Poly"
msgstr "Poly সম্পাদন করুন"
msgid "Edit Poly (Remove Point)"
msgstr "Poly সম্পাদন করুন (বিন্দু অপসারণ করুন)"
msgid "Please Confirm..."
msgstr "অনুগ্রহ করে নিশ্চিত করুন..."
msgid "Create Navigation Polygon"
msgstr "Navigation Polygon তৈরি করুন"
@ -4344,6 +4206,57 @@ msgstr "নির্দিষ্ট পাথে নতুন অক্লুড
msgid "Convert to Parallax2D"
msgstr "Parallax2D তে রূপান্তর করুন"
msgid "Restart Emission"
msgstr "নির্গমন পুনরায় চালু করুন"
msgid "Generate Visibility Rect"
msgstr "ভিজিবিলিটি রেক্ট তৈরি করুন"
msgid "Load Emission Mask"
msgstr "Emission Mask লোড করুন"
msgid "Solid Pixels"
msgstr "সলিড পিক্সেল"
msgid "Directed Border Pixels"
msgstr "নির্দেশিত বর্ডার পিক্সেল"
msgid "Convert to CPUParticles2D"
msgstr "CPUParticles2D এ রূপান্তর করুন"
msgid "Generation Time (sec):"
msgstr "তৈরিতে সময় (সেকেন্ড):"
msgid "Convert to GPUParticles2D"
msgstr "GPUParticles2D তে রূপান্তর করুন"
msgid "\"%s\" doesn't inherit from Node3D."
msgstr "\"%s\" Node3D থেকে উত্তরাধিকারসূত্রে পাওয়া যায় না।"
msgid "\"%s\" doesn't contain geometry."
msgstr "\"%s\"-এ জ্যামিতি নেই।"
msgid "\"%s\" doesn't contain face geometry."
msgstr "\"%s\"-এ মুখের জ্যামিতি নেই।"
msgid "Create Emitter"
msgstr "Emitter তৈরি করুন"
msgid "Surface Points"
msgstr "সারফেস পয়েন্ট"
msgid "Surface Points+Normal (Directed)"
msgstr "সারফেস পয়েন্ট + নরমাল (নির্দেশিত)"
msgid "Volume"
msgstr "আয়তন"
msgid "Convert to CPUParticles3D"
msgstr "CPUParticles3D এ রূপান্তর করুন"
msgid "Convert to GPUParticles3D"
msgstr "GPUParticles3D তে রূপান্তর করুন"
msgid "Remove Point from Curve"
msgstr "বক্ররেখা হতে বিন্দু অপসারণ করুন"
@ -4371,9 +4284,6 @@ msgstr "বিন্দু অপসারণ করুন"
msgid "Close Curve"
msgstr "বক্ররেখা বন্ধ করুন"
msgid "Please Confirm..."
msgstr "অনুগ্রহ করে নিশ্চিত করুন..."
msgid "Remove all curve points?"
msgstr "সব কার্ভ পয়েন্ট সরান?"
@ -4425,12 +4335,6 @@ msgstr "UV Map তৈরি করুন"
msgid "Transform UV Map"
msgstr "UV Map রুপান্তর করুন"
msgid "Open Polygon 2D UV editor."
msgstr "বহুভুজ 2D UV সম্পাদক খুলুন।"
msgid "Polygon 2D UV Editor"
msgstr "Polygon 2D UV এডিটর"
msgid "UV"
msgstr "অতিবেগুনী"
@ -4461,6 +4365,12 @@ msgstr "গ্রিড দেখান"
msgid "Configure Grid:"
msgstr "গ্রিড কনফিগার:"
msgid "Edit Poly"
msgstr "Poly সম্পাদন করুন"
msgid "Edit Poly (Remove Point)"
msgstr "Poly সম্পাদন করুন (বিন্দু অপসারণ করুন)"
msgid "ERROR: Couldn't load resource!"
msgstr "সমস্যা: রিসোর্স লোড করা সম্ভব হয়নি!"
@ -4524,9 +4434,6 @@ msgstr "পূর্বে খুঁজুন"
msgid "Sort"
msgstr "সাজান"
msgid "File"
msgstr "ফাইল"
msgid "Open..."
msgstr "খুলুন…"
@ -4569,12 +4476,6 @@ msgstr "পূর্বের সম্পাদিত ডকুমেন্ট
msgid "Go to next edited document."
msgstr "পরের সম্পাদিত ডকুমেন্টে যান।"
msgid "The following files are newer on disk."
msgstr "নিম্নলিখিত ফাইলগুলি ডিস্কে নতুন।"
msgid "What action should be taken?:"
msgstr "কোন সিদ্ধান্ত নেয়া উচিত হবে?:"
msgid "Uppercase"
msgstr "বড় হাতের অক্ষর"
@ -4721,6 +4622,18 @@ msgstr "Delete অ্যানিমেশন"
msgid "Animation Frames:"
msgstr "অ্যানিমেশনের ফ্রেমসমূহ:"
msgid "Play selected animation backwards from current pos. (A)"
msgstr "নির্বাচিত অ্যানিমেশনটি বর্তমান স্থান হতে পিছনের দিকে চালান। (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "নির্বাচিত অ্যানিমেশনটি শেষ হতে পিছনের দিকে চালান। (Shift+A)"
msgid "Play selected animation from start. (Shift+D)"
msgstr "নির্বাচিত অ্যানিমেশনটি শুরু হতে চালান। (Shift+D)"
msgid "Play selected animation from current pos. (D)"
msgstr "নির্বাচিত অ্যানিমেশনটি বর্তমান স্থান হতে চালান। (D)"
msgid "Frame Duration:"
msgstr "ফ্রেমের সময়কাল:"
@ -4736,6 +4649,9 @@ msgstr "বিচ্ছেদ"
msgid "Offset"
msgstr "অফসেট"
msgid "Auto Slice"
msgstr "স্বয়ংক্রিয় টুকরো"
msgid "Reload"
msgstr "রিলোড"
@ -4754,9 +4670,6 @@ msgstr "পিক্সেল স্ন্যাপ"
msgid "Grid Snap"
msgstr "গ্রিড স্ন্যাপ"
msgid "Auto Slice"
msgstr "স্বয়ংক্রিয় টুকরো"
msgid "Step:"
msgstr "পদক্ষেপ:"
@ -5005,10 +4918,6 @@ msgstr "দৃশ্য সংগ্রহ বৈশিষ্ট্য:"
msgid "Tile properties:"
msgstr "টাইল বৈশিষ্ট্য:"
msgctxt "Tool"
msgid "Line"
msgstr "লাইন"
msgid "Error"
msgstr "সমস্যা/ভুল"
@ -5374,9 +5283,6 @@ msgstr "দৃশ্যের নাম খালি।"
msgid "File name invalid."
msgstr "ফাইলের নাম অবৈধ।"
msgid "File name begins with a dot."
msgstr "ফাইলের নাম একটি বিন্দু দিয়ে শুরু হয়।"
msgid "File already exists."
msgstr "ফাইল আগে থেকেই আছে।"
@ -5435,9 +5341,6 @@ msgstr "নতুন দৃশ্য এইরূপে সংরক্ষণ
msgid "Make Local"
msgstr "স্থানীয় করুন"
msgid "Enable Scene Unique Name(s)"
msgstr "দৃশ্যের অনন্য নাম(গুলি) সক্ষম করুন"
msgid "Disable Scene Unique Name(s)"
msgstr "দৃশ্যের অনন্য নাম(গুলি) অক্ষম করুন"
@ -5652,9 +5555,6 @@ msgstr "মোড:"
msgid "Built-in Shader:"
msgstr "পূর্বনির্মিত শেডার:"
msgid "Name cannot be empty."
msgstr "নাম খালি রাখা যাবে না।"
msgid "Name must be a valid identifier."
msgstr "নাম অবশ্যই একটি বৈধ শনাক্তকারী হতে হবে।"
@ -5673,9 +5573,6 @@ msgstr "কনভার্ট করার জন্য অবৈধ টাই
msgid "Cannot resize array."
msgstr "অ্যারের আকার পরিবর্তন করা যায়নি।"
msgid "Not based on a resource file"
msgstr "রিসোর্স ফাইলের উপর ভিত্তি করে নয়"
msgid "Cannot instantiate GDScript class."
msgstr "GDScript ক্লাস ইনস্ট্যান্ট করা যাচ্ছে না।"
@ -5691,12 +5588,6 @@ msgstr "ব্লেন্ডার এক্সিকিউটেবল চা
msgid "Couldn't extract version information from Blender executable at: %s."
msgstr "ব্লেন্ডার থেকে এক্সিকিউটেবল সংস্করণ তথ্য বের করা যায়নি: %s।"
msgid "Plane:"
msgstr "সমতল:"
msgid "Floor:"
msgstr "মেঝে:"
msgid "No transition available."
msgstr "কোনো ট্রানজিশন নেই।"
@ -5721,9 +5612,6 @@ msgstr "পূর্ববর্তী হোল্ড:"
msgid "Integrate indirect lighting %d%%"
msgstr "পরোক্ষ আলো একত্রিত করুন %d%%"
msgid "Baking lightprobes"
msgstr "বেকিং lightprobes"
msgid "Integrating light probes %d%%"
msgstr "হালকা প্রোবগুলিকে একীভূত করা হচ্ছে %d%%"
@ -5813,9 +5701,6 @@ msgstr "ডিভাইসে ইনস্টল করা যায়নি: %
msgid "Missing 'bin' directory!"
msgstr "অনুপস্থিত 'বিন' ডিরেক্টরি!"
msgid "Signing release %s..."
msgstr "রিলিজ %s স্বাক্ষর করা হচ্ছে..।"
msgid "Could not start apksigner executable."
msgstr "apksigner এক্সিকিউটেবল শুরু করা যায়নি।"
@ -5832,9 +5717,6 @@ msgstr "অ্যান্ড্রয়েডের জন্য রপ্ত
msgid "Could not write expansion package file!"
msgstr "সম্প্রসারণ প্যাকেজ ফাইল লিখতে পারিনি!"
msgid "Package not found: \"%s\"."
msgstr "প্যাকেজ পাওয়া যায়নি: \"%s\"।"
msgid "Creating APK..."
msgstr "APK তৈরি করা হচ্ছে..।"
@ -5877,9 +5759,6 @@ msgstr "\"%s\" পাথে একটি ফাইল তৈরি করতে
msgid "The character '%s' is not allowed in Identifier."
msgstr "আইডেন্টিফায়ারে '%s' অক্ষরটি অনুমোদিত নয়।"
msgid "Could not start simctl executable."
msgstr "simctl এক্সিকিউটেবল শুরু করা যায়নি।"
msgid "Could not start ios-deploy executable."
msgstr "ios-deploy executable শুরু করা যায়নি।"
@ -6178,14 +6057,11 @@ msgstr "অপারেটর এর কাছে অবৈধ আর্গু
msgid "Invalid variable type (samplers are not allowed)."
msgstr "অবৈধ পরিবর্তনশীল প্রকার (স্যাম্পলার অনুমোদিত নয়)।"
msgid "Duplicated case label: %d."
msgstr "ডুপ্লিকেট কেস লেবেল: %d।"
msgid "Expected an integer constant."
msgstr "একটি পূর্ণসংখ্যা ধ্রুবক প্রত্যাশিত।"
msgid "Use of '%s' is not allowed here."
msgstr "এখানে '%s' ব্যবহার অনুমোদিত নয়।"
msgid "Duplicated case label: %d."
msgstr "ডুপ্লিকেট কেস লেবেল: %d।"
msgid "Invalid shader type. Valid types are: %s"
msgstr "অবৈধ শেডার প্রকার। বৈধ প্রকারগুলি হল: %s"
@ -6327,33 +6203,12 @@ msgstr "ম্যাক্রো সম্প্রসারণের শুর
msgid "'##' must not appear at end of macro expansion."
msgstr "ম্যাক্রো সম্প্রসারণের শেষে '##' থাকা উচিত নয়।"
msgid "Unmatched elif."
msgstr "অতুলনীয় elif ।"
msgid "Missing condition."
msgstr "Condition অনুপস্থিত।"
msgid "Condition evaluation error."
msgstr "Condition মূল্যায়নে ত্রুটি।"
msgid "Unmatched else."
msgstr "অতুলনীয় else।"
msgid "Invalid else."
msgstr "অগ্রহনযোগ্য else।"
msgid "Unmatched endif."
msgstr "অতুলনীয় endif।"
msgid "Invalid endif."
msgstr "অগ্রহনযোগ্য endif।"
msgid "Invalid ifdef."
msgstr "অগ্রহনযোগ্য ifdef।"
msgid "Invalid ifndef."
msgstr "অগ্রহনযোগ্য ifndef।"
msgid "Shader include file does not exist:"
msgstr "shader include ফাইলটি বিদ্যমান নয়:"
@ -6372,12 +6227,6 @@ msgstr "Cycilic include পাওয়া গেছে"
msgid "Shader max include depth exceeded."
msgstr "Shader max include depth অতিক্রম করেছে।"
msgid "Invalid pragma directive."
msgstr "গ্রহণযোগ্য pragma ডিরেক্টিভ।"
msgid "Invalid undef."
msgstr "অগ্রহনযোগ্য undef।"
msgid "Macro expansion limit exceeded."
msgstr "Macro expansion সীমা অতিক্রান্ত হয়েছে।"

View File

@ -27,13 +27,14 @@
# Azor Carreras Alcaraz <azorcarreras@gmail.com>, 2024.
# Alberto Blanco Celdrán <flaberto.abc@gmail.com>, 2024.
# Luna Moreno <akaluna99@gmail.com>, 2024.
# Lukas Tenbrink <lukas.tenbrink@gmail.com>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor interface\n"
"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2024-09-03 22:09+0000\n"
"Last-Translator: Luna Moreno <akaluna99@gmail.com>\n"
"PO-Revision-Date: 2025-01-09 13:44+0000\n"
"Last-Translator: Lukas Tenbrink <lukas.tenbrink@gmail.com>\n"
"Language-Team: Catalan <https://hosted.weblate.org/projects/godot-engine/"
"godot/ca/>\n"
"Language: ca\n"
@ -41,7 +42,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 5.8-dev\n"
"X-Generator: Weblate 5.10-dev\n"
msgid "Main Thread"
msgstr "Fil principal"
@ -503,6 +504,12 @@ msgstr "Acció"
msgid "Deadzone"
msgstr "Zona morta"
msgid "Name:"
msgstr "Nom:"
msgid "Type:"
msgstr "Tipus:"
msgid "Time:"
msgstr "Temps:"
@ -614,16 +621,6 @@ msgstr "Canvia la durada de l'Animació"
msgid "Change Animation Loop"
msgstr "Modifica el bucle d'Animació"
msgid "Can't change loop mode on animation instanced from imported scene."
msgstr ""
"No es pot canviar el mode de repetició d'animacions instanciades des d'una "
"escena importada."
msgid "Can't change loop mode on animation embedded in another scene."
msgstr ""
"No es pot canviar el mode de repetició d'animacions incrustades en una altra "
"escena."
msgid "Property Track..."
msgstr "Pista de Propietats..."
@ -708,9 +705,6 @@ msgstr "Escala:"
msgid "Blend Shape:"
msgstr "Forma de Barreja:"
msgid "Type:"
msgstr "Tipus:"
msgid "(Invalid, expected type: %s)"
msgstr "(No vàlid, tipus esperat: %s)"
@ -1020,9 +1014,6 @@ msgstr "Mostra només les pistes dels nodes seleccionats en l'arbre."
msgid "Group tracks by node or display them as plain list."
msgstr "Agrupa les pistes per node o mostra-les en una llista."
msgid "Snap:"
msgstr "Ajustar:"
msgid "Animation step value."
msgstr "Valor del pas d'Animació."
@ -1181,6 +1172,12 @@ msgstr "Seleccioneu les Pistes a Copiar"
msgid "Select All/None"
msgstr "(Des)selecciona-ho tot"
msgid "Close"
msgstr "Tancar"
msgid "Error!"
msgstr "Error !"
msgid "Add Audio Track Clip"
msgstr "Afegir Clip de Pista d'Àudio"
@ -1293,9 +1290,6 @@ msgstr "Desconnecta el senyal després de la seva primera emissió."
msgid "Cannot connect signal"
msgstr "No es pot connectar el senyal"
msgid "Close"
msgstr "Tancar"
msgid "Connect"
msgstr "Connectar"
@ -1381,6 +1375,9 @@ msgstr "Instància:"
msgid "Toggle Visibility"
msgstr "Visibilitat"
msgid "Clear"
msgstr "Neteja"
msgid "Monitors"
msgstr "Monitors"
@ -1399,9 +1396,6 @@ msgstr "Atura"
msgid "Start"
msgstr "Inicia"
msgid "Clear"
msgstr "Neteja"
msgid "Measure:"
msgstr "Mesura:"
@ -1606,12 +1600,6 @@ msgstr "Posseeix"
msgid "Resources Without Explicit Ownership:"
msgstr "Recursos Sense Propietat Explícita:"
msgid "Could not create folder."
msgstr "No s'ha pogut crear el directori."
msgid "Create Folder"
msgstr "Crea un Directori"
msgid "Thanks from the Godot community!"
msgstr "Gràcies de la part de la Comunitat del Godot!"
@ -1777,18 +1765,12 @@ msgstr "Ubicació del Nou Disseny..."
msgid "Open Audio Bus Layout"
msgstr "Obre un Disseny de Bus d'Àudio"
msgid "There is no '%s' file."
msgstr "No hi ha cap fitxer '%s'."
msgid "Error saving file: %s"
msgstr "S'ha produit un error al desar el fitxer! %s"
msgid "Layout:"
msgstr "Disseny:"
msgid "Invalid file, not an audio bus layout."
msgstr "Fitxer incorrecte. No és un disseny de bus d'àudio."
msgid "Error saving file: %s"
msgstr "S'ha produit un error al desar el fitxer! %s"
msgid "Add Bus"
msgstr "Afegeix Bus"
@ -2087,20 +2069,14 @@ msgstr ""
msgid "Editor"
msgstr "Editor"
msgid "Property:"
msgstr "Propietat:"
msgid "Show in FileSystem"
msgstr "Mostrar en el Sistema de Fitxers"
msgid "Signal:"
msgstr "Senyal:"
msgid "Open in File Manager"
msgstr "Obrir en el Gestor de Fitxers"
msgid "%d matches."
msgstr "%d coincidències."
msgid "Method"
msgstr "Mètode"
msgid "Signal"
msgstr "Senyal"
msgid "Class"
msgstr "Classe"
msgid "Constant"
msgstr "Constant"
@ -2111,6 +2087,18 @@ msgstr "Propietat"
msgid "Theme Property"
msgstr "Propietats del tema"
msgid "Method"
msgstr "Mètode"
msgid "Signal"
msgstr "Senyal"
msgid "File"
msgstr "Fitxer"
msgid "%d matches."
msgstr "%d coincidències."
msgid "Search Help"
msgstr "Cerca Ajuda"
@ -2144,9 +2132,6 @@ msgstr "Només Propietats del Tema"
msgid "Member Type"
msgstr "Tipus de Membre"
msgid "Class"
msgstr "Classe"
msgid "Move Up"
msgstr "Mou Amunt"
@ -2159,8 +2144,8 @@ msgstr "Redimensiona la Matriu"
msgid "Set %s"
msgstr "Definir %s"
msgid "Name:"
msgstr "Nom:"
msgid "Favorites"
msgstr "Preferits"
msgid "Creating Mesh Previews"
msgstr "Creant Previsualitzacions de Malles"
@ -2278,15 +2263,6 @@ msgstr ""
msgid "Open Base Scene"
msgstr "Obre una Escena Base"
msgid "Quick Open..."
msgstr "Obertura Ràpida..."
msgid "Quick Open Scene..."
msgstr "Obertura Ràpida d'Escenes..."
msgid "Quick Open Script..."
msgstr "Obertura Ràpida d'Scripts..."
msgid ""
"A root node is required to save the scene. You can add a root node using the "
"Scene tree dock."
@ -2297,9 +2273,6 @@ msgstr ""
msgid "Save Scene As..."
msgstr "Anomena i Desa l'Escena..."
msgid "Current scene not saved. Open anyway?"
msgstr "L'escena actual no s'ha desat. Voleu obrir-la igualment?"
msgid "Can't undo while mouse buttons are pressed."
msgstr "No es pot desfer mentre hi ha botons del ratolí premuts."
@ -2373,34 +2346,6 @@ msgstr "L'Escena '%s' té dependències no vàlides:"
msgid "Clear Recent Scenes"
msgstr "Buida les Escenes Recents"
msgid ""
"No main scene has ever been defined, select one?\n"
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
"No s'ha definit cap escena principal. Seleccioneu-ne una.\n"
"És possible triar-ne una altra des de \"Configuració del Projecte\" en la "
"categoria \"Aplicació\"."
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 ""
"L'escena '%s' no existeix. Seleccioneu-ne una de vàlida.\n"
"És possible triar-ne una altra més endavant a \"Configuració del Projecte\" "
"en la categoria \"Aplicació\"."
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 ""
"L'escena '%s' seleccionada no és un fitxer d'escena. Seleccioneu-ne un de "
"vàlid.\n"
"És possible triar-ne una altra més endavant a \"Configuració del Projecte\" "
"en la categoria \"Aplicació\"."
msgid "Default"
msgstr "Predeterminat"
@ -2455,6 +2400,15 @@ msgstr "Obre Recent"
msgid "Save Scene"
msgstr "Desa Escena"
msgid "Quick Open..."
msgstr "Obertura Ràpida..."
msgid "Quick Open Scene..."
msgstr "Obertura Ràpida d'Escenes..."
msgid "Quick Open Script..."
msgstr "Obertura Ràpida d'Scripts..."
msgid "MeshLibrary..."
msgstr "Biblioteca de Models (MeshLibrary)..."
@ -2574,13 +2528,6 @@ msgstr "Exporta Biblioteca"
msgid "Open & Run a Script"
msgstr "Obre i Executa un Script"
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?"
msgid "New Inherited"
msgstr "Nou Heretat"
@ -2690,9 +2637,6 @@ msgstr "Fes-lo Únic"
msgid "Save As..."
msgstr "Anomena i Desa..."
msgid "Show in FileSystem"
msgstr "Mostrar en el Sistema de Fitxers"
msgid "New %s"
msgstr "Nou %s"
@ -2702,6 +2646,9 @@ msgstr "Script Nou..."
msgid "Write your logic in the _run() method."
msgstr "Escriu la lògica en el mètode _run()."
msgid "None"
msgstr "Cap"
msgid "Editor Settings"
msgstr "Configuració de l'Editor"
@ -2822,6 +2769,16 @@ msgstr "Extraient Plantilles d'Exportació"
msgid "Importing:"
msgstr "Importació:"
msgid "Export templates are missing. Download them or install from a file."
msgstr ""
"Les plantilles d'exportació falten. Descarregueu-les o instal·leu-les des "
"d'un fitxer."
msgid "Official export templates aren't available for development builds."
msgstr ""
"Les plantilles oficials d'exportació no estan disponibles per a les versions "
"de desenvolupament."
msgid "Uncompressing Android Build Sources"
msgstr "Descomprimint les Fonts de Compilació d'Android"
@ -2831,11 +2788,6 @@ msgstr "Gestor de Plantilles d'Exportació"
msgid "Current Version:"
msgstr "Versió Actual:"
msgid "Export templates are missing. Download them or install from a file."
msgstr ""
"Les plantilles d'exportació falten. Descarregueu-les o instal·leu-les des "
"d'un fitxer."
msgid "Export templates are installed and ready to be used."
msgstr ""
"Les plantilles d'exportació estan instal·lades i llestes per a ser "
@ -2864,11 +2816,6 @@ msgstr ""
"Descarrega i instal·la plantilles per a la versió actual des del millor "
"mirall possible."
msgid "Official export templates aren't available for development builds."
msgstr ""
"Les plantilles oficials d'exportació no estan disponibles per a les versions "
"de desenvolupament."
msgid "Install templates from a local file."
msgstr "Instal·la plantilles des d'un fitxer local."
@ -2965,9 +2912,6 @@ msgstr "Gestor de Plantilles d'Exportació"
msgid "Browse"
msgstr "Navega"
msgid "Favorites"
msgstr "Preferits"
msgid "View items as a grid of thumbnails."
msgstr "Visualitza en una quadrícula de miniatures."
@ -3004,6 +2948,9 @@ msgstr "S'està duplicant el fitxer:"
msgid "Duplicating folder:"
msgstr "S'està duplicant el directori:"
msgid "Create Folder"
msgstr "Crea un Directori"
msgid "New Inherited Scene"
msgstr "Nova Escena Heretada"
@ -3025,9 +2972,6 @@ msgstr "Eliminar de Preferits"
msgid "Reimport"
msgstr "ReImportar"
msgid "Open in File Manager"
msgstr "Obrir en el Gestor de Fitxers"
msgid "New Folder..."
msgstr "Nou Directori..."
@ -3132,12 +3076,6 @@ msgstr "Selecciona el Directori Actual"
msgid "Select This Folder"
msgstr "Seleccionar aquest Directori"
msgid "All Recognized"
msgstr "Tots Reconeguts"
msgid "All Files (*)"
msgstr "Tots els Fitxers (*)"
msgid "Open a File"
msgstr "Obre un Fitxer"
@ -3153,6 +3091,9 @@ msgstr "Obre un Fitxer o Directori"
msgid "Save a File"
msgstr "Desa un Fitxer"
msgid "Could not create folder."
msgstr "No s'ha pogut crear el directori."
msgid "Go Back"
msgstr "Enrere"
@ -3195,15 +3136,18 @@ msgstr "Actualitzar fitxers."
msgid "(Un)favorite current folder."
msgstr "Eliminar carpeta actual de preferits."
msgid "Toggle the visibility of hidden files."
msgstr "Commutar visibilitat dels fitxers ocults."
msgid "Directories & Files:"
msgstr "Directoris i Fitxers:"
msgid "Toggle the visibility of hidden files."
msgstr "Commutar visibilitat dels fitxers ocults."
msgid "Preview:"
msgstr "Vista prèvia:"
msgid "Filter"
msgstr "Filtre"
msgid "File:"
msgstr "Fitxer:"
@ -3213,8 +3157,8 @@ msgstr "Reprodueix el projecte."
msgid "Play the edited scene."
msgstr "Reprodueix l'escena editada."
msgid "Quick Run Scene..."
msgstr "Execució Ràpida de l'Escena..."
msgid "Network Profiler"
msgstr "Perfilador de Xarxa"
msgid "Play This Scene"
msgstr "Reprodueix aquesta Escena"
@ -3576,7 +3520,7 @@ msgid "Storage"
msgstr "Emmagatzematge"
msgid "Toggle Autoplay"
msgstr "Reproducció Automàtica"
msgstr "Reproducció Automàtica"
msgid "Create New Animation"
msgstr "Crea una Nova Animació"
@ -3605,18 +3549,6 @@ msgstr "Mesclar Següent Canviat"
msgid "Change Blend Time"
msgstr "Modifica el Temps de Mescla"
msgid "Play selected animation backwards from current pos. (A)"
msgstr "Reprodueix enrera l'animació seleccionada des de la posició actual. (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Reprodueix enrera l'animació seleccionada des del final. (Maj+A)"
msgid "Play selected animation from start. (Shift+D)"
msgstr "Reproduir l'animació seleccionada des de l'inici. (Maj+D)"
msgid "Play selected animation from current pos. (D)"
msgstr "Reproduir l'animació seleccionada des de la posició actual. (D)"
msgid "Animation position (in seconds)."
msgstr "Posició de l'Animació (en segons)."
@ -3677,9 +3609,6 @@ msgstr "Inclou Gizmos (3D)"
msgid "Pin AnimationPlayer"
msgstr "Fixar AnimationPlayer"
msgid "Error!"
msgstr "Error !"
msgid "Cross-Animation Blend Times"
msgstr "Temps de mescla entre Animacions"
@ -4111,30 +4040,6 @@ msgstr "CentreV Ample"
msgid "Full Rect"
msgstr "Rect. Complet"
msgid "Load Emission Mask"
msgstr "Carrega una Màscara d'Emissió"
msgid "Emission Mask"
msgstr "Màscara d'Emissió"
msgid "Solid Pixels"
msgstr "Píxels sòlids"
msgid "Border Pixels"
msgstr "Píxels de la Vora"
msgid "Directed Border Pixels"
msgstr "Píxels de la Vora Dirigits"
msgid "Generate Visibility AABB"
msgstr "Genera un AABB de Visibilitat"
msgid "Create Emission Points From Node"
msgstr "Crea Punts d'Emissió des d'un Node"
msgid "Generation Time (sec):"
msgstr "Temps de generació (s):"
msgid "Load Curve Preset"
msgstr "Carrega un ajustament per la Corba"
@ -4248,38 +4153,9 @@ msgstr "Modifica el Radi de Llum"
msgid "Change Notifier AABB"
msgstr "Canviar Notificador AABB"
msgid "Generate Visibility Rect"
msgstr "Genera un Rectangle de Visibilitat"
msgid "The geometry's faces don't contain any area."
msgstr "Les cares de la geometria no contenen cap àrea."
msgid "Create Emitter"
msgstr "Crea un Emissor"
msgid "Emission Points:"
msgstr "Punts d'Emissió:"
msgid "Surface Points"
msgstr "Punts de la Superfície"
msgid "Surface Points+Normal (Directed)"
msgstr "Punts + Normal (Dirigida)"
msgid "Volume"
msgstr "Volum"
msgid "Emission Source:"
msgstr "Font d'emissió:"
msgid "Create Occluder Polygon"
msgstr "Crea un Polígon Oclusor"
msgid "Failed creating lightmap images, make sure path is writable."
msgstr ""
"No s'han pogut crear les imatges de lightmap. Comproveu que el camí tingui "
"permisos d'escriptura."
msgid "Bake Lightmaps"
msgstr "Precalcular Lightmaps"
@ -4289,9 +4165,6 @@ msgstr "No s'ha pogut crear una forma de col·lisió Trimesh."
msgid "Mesh is empty!"
msgstr "La malla és buida!"
msgid "Create Navigation Mesh"
msgstr "Crea un malla de Navegació"
msgid "Contained Mesh is not of type ArrayMesh."
msgstr "La Malla continguda no és del tipus ArrayMesh."
@ -4304,6 +4177,9 @@ msgstr "Cap malla per depurar."
msgid "Mesh has no UV in layer %d."
msgstr "La malla no té UV a la capa %d."
msgid "Create Navigation Mesh"
msgstr "Crea un malla de Navegació"
msgid "Create Outline"
msgstr "Crea el Contorn"
@ -4419,11 +4295,8 @@ msgstr "Quantitat:"
msgid "Populate"
msgstr "Omple"
msgid "Edit Poly"
msgstr "Edita Polígon"
msgid "Edit Poly (Remove Point)"
msgstr "Edita el Polígon (Elimina un Punt)"
msgid "Please Confirm..."
msgstr "Confirmeu..."
msgid "Create Navigation Polygon"
msgstr "Crea un Polígon de Navegació"
@ -4479,9 +4352,6 @@ msgstr "Alinear Transformació amb la Vista"
msgid "Align Rotation with View"
msgstr "Alinea Rotació amb la Vista"
msgid "None"
msgstr "Cap"
msgid "Rotate"
msgstr "Rotar"
@ -4671,6 +4541,54 @@ msgstr "Pre"
msgid "Post"
msgstr "Post"
msgid "Generate Visibility Rect"
msgstr "Genera un Rectangle de Visibilitat"
msgid "Load Emission Mask"
msgstr "Carrega una Màscara d'Emissió"
msgid "Solid Pixels"
msgstr "Píxels sòlids"
msgid "Border Pixels"
msgstr "Píxels de la Vora"
msgid "Directed Border Pixels"
msgstr "Píxels de la Vora Dirigits"
msgid "Emission Mask"
msgstr "Màscara d'Emissió"
msgid "Generation Time (sec):"
msgstr "Temps de generació (s):"
msgid "Generate Visibility AABB"
msgstr "Genera un AABB de Visibilitat"
msgid "Create Emission Points From Node"
msgstr "Crea Punts d'Emissió des d'un Node"
msgid "The geometry's faces don't contain any area."
msgstr "Les cares de la geometria no contenen cap àrea."
msgid "Create Emitter"
msgstr "Crea un Emissor"
msgid "Emission Points:"
msgstr "Punts d'Emissió:"
msgid "Surface Points"
msgstr "Punts de la Superfície"
msgid "Surface Points+Normal (Directed)"
msgstr "Punts + Normal (Dirigida)"
msgid "Volume"
msgstr "Volum"
msgid "Emission Source:"
msgstr "Font d'emissió:"
msgid "Remove Point from Curve"
msgstr "Elimina un Punt de la Corba"
@ -4707,9 +4625,6 @@ msgstr "Elimina el Punt"
msgid "Close Curve"
msgstr "Tanca la Corba"
msgid "Please Confirm..."
msgstr "Confirmeu..."
msgid "Mirror Handle Angles"
msgstr "Reflecteix els Angles de la Nansa"
@ -4768,13 +4683,6 @@ msgstr "La propietat esquelet del Polygon2D no apunta a un node Skeleton2D"
msgid "Sync Bones"
msgstr "Sincronitzar Ossos"
msgid ""
"No texture in this polygon.\n"
"Set a texture to be able to edit UV."
msgstr ""
"No hi ha textura en aquest polígon.\n"
"Assigneu una textura per a poder editar el UV."
msgid "Create UV Map"
msgstr "Crea un Mapa UV"
@ -4812,21 +4720,15 @@ msgstr "Transformar Polígon"
msgid "Paint Bone Weights"
msgstr "Pintar Pes dels Ossos"
msgid "Open Polygon 2D UV editor."
msgstr "Obrir editor UV de Polígons 2D."
msgid "Polygon 2D UV Editor"
msgstr "Editor d'UVs de Polígons 2D"
msgid "UV"
msgstr "UV"
msgid "Points"
msgstr "Punts"
msgid "Polygons"
msgstr "Polígons"
msgid "UV"
msgstr "UV"
msgid "Bones"
msgstr "Ossos"
@ -4895,6 +4797,12 @@ msgstr "Sincronitzar Ossos amb el Polígon"
msgid "Create Polygon3D"
msgstr "Crear Polígon3D"
msgid "Edit Poly"
msgstr "Edita Polígon"
msgid "Edit Poly (Remove Point)"
msgstr "Edita el Polígon (Elimina un Punt)"
msgid "ERROR: Couldn't load resource!"
msgstr "Error: No es pot carregar el recurs!"
@ -4967,9 +4875,6 @@ msgstr "Alterna l'ordenació alfabètica de la llista de mètodes."
msgid "Sort"
msgstr "Ordena"
msgid "File"
msgstr "Fitxer"
msgid "Open..."
msgstr "Obrir..."
@ -5054,9 +4959,6 @@ msgstr ""
msgid "Go to Function"
msgstr "Vés a la Funció"
msgid "Lookup Symbol"
msgstr "Cercar Símbol"
msgid "Pick Color"
msgstr "Tria un Color"
@ -5132,6 +5034,9 @@ msgstr "Anar a la Funció..."
msgid "Go to Line..."
msgstr "Anar a la Línia..."
msgid "Lookup Symbol"
msgstr "Cercar Símbol"
msgid "Toggle Breakpoint"
msgstr "Commuta el punt d'Interrupció"
@ -5228,6 +5133,18 @@ msgstr "Animacions:"
msgid "Animation Frames:"
msgstr "Fotogrames d'Animació:"
msgid "Play selected animation backwards from current pos. (A)"
msgstr "Reprodueix enrera l'animació seleccionada des de la posició actual. (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "Reprodueix enrera l'animació seleccionada des del final. (Maj+A)"
msgid "Play selected animation from start. (Shift+D)"
msgstr "Reproduir l'animació seleccionada des de l'inici. (Maj+D)"
msgid "Play selected animation from current pos. (D)"
msgstr "Reproduir l'animació seleccionada des de la posició actual. (D)"
msgid "Zoom Reset"
msgstr "Restablir zoom"
@ -5237,6 +5154,9 @@ msgstr "Seleccionar Fotogrames"
msgid "Size"
msgstr "Mida"
msgid "Auto Slice"
msgstr "Auto Tall"
msgid "Reload"
msgstr "Torna a Carregar"
@ -5258,9 +5178,6 @@ msgstr "Ajustament de Píxels"
msgid "Grid Snap"
msgstr "Ajustar a la Quadrícula"
msgid "Auto Slice"
msgstr "Auto Tall"
msgid "Step:"
msgstr "Pas:"
@ -5777,18 +5694,9 @@ msgstr ""
msgid "The following files failed extraction from package:"
msgstr "Ha fracassat l'extracció del paquet dels següents fitxers:"
msgid "Import & Edit"
msgstr "Importa i Edita"
msgid "Create & Edit"
msgstr "Crea i Edita"
msgid "Install Project:"
msgstr "Instal·la el Projecte:"
msgid "Install & Edit"
msgstr "Instal·la i Edita"
msgid "Project Name:"
msgstr "Nom del Projecte:"
@ -6065,32 +5973,14 @@ msgstr "No Disponible"
msgid "Wrong extension chosen."
msgstr "L'extensió triada no és correcta."
msgid "Change Cylinder Radius"
msgstr "Canviar Radi del Cilindre"
msgid "Change Cylinder Height"
msgstr "Canviar Alçada del Cilindre"
msgid "Next Plane"
msgstr "Pla següent"
msgid "Previous Plane"
msgstr "Pla anterior"
msgid "Plane:"
msgstr "Pla:"
msgid "Next Floor"
msgstr "Planta Següent"
msgid "GridMap Delete Selection"
msgstr "Elimina la Selecció del GridMap"
msgid "Previous Floor"
msgstr "Planta Anterior"
msgid "Floor:"
msgstr "Planta:"
msgid "GridMap Delete Selection"
msgstr "Elimina la Selecció del GridMap"
msgid "Next Floor"
msgstr "Planta Següent"
msgid "Edit X Axis"
msgstr "Edita l'Eix X"
@ -6101,6 +5991,12 @@ msgstr "Edita l'Eix Y"
msgid "Edit Z Axis"
msgstr "Edita l'Eix Z"
msgid "GridMap Settings"
msgstr "Configuració del GridMap"
msgid "Pick Distance:"
msgstr "Trieu la distància:"
msgid "Cursor Rotate X"
msgstr "Gira X en el Cursor"
@ -6110,36 +6006,6 @@ msgstr "Gira Y en el Cursor"
msgid "Cursor Rotate Z"
msgstr "Gira Z en el Cursor"
msgid "Cursor Back Rotate X"
msgstr "Gira Enrere X en el Cursor"
msgid "Cursor Back Rotate Y"
msgstr "Gira Enrere Y en el Cursor"
msgid "Cursor Back Rotate Z"
msgstr "Gira Enrere Z en el Cursor"
msgid "Cursor Clear Rotation"
msgstr "Reestableix la Rotació del Cursor"
msgid "Cut Selection"
msgstr "Tallar Selecció"
msgid "Clear Selection"
msgstr "Esborra la Selecció"
msgid "Fill Selection"
msgstr "Omplir la Selecció"
msgid "Grid Map"
msgstr "Mapa de Graella"
msgid "GridMap Settings"
msgstr "Configuració del GridMap"
msgid "Pick Distance:"
msgstr "Trieu la distància:"
msgid "Class name can't be a reserved keyword"
msgstr "El nom de la classe no pot ser una paraula clau reservada"
@ -6158,9 +6024,6 @@ msgstr "RPC Sortint"
msgid "Config"
msgstr "Configuració"
msgid "Network Profiler"
msgstr "Perfilador de Xarxa"
msgid "A NavigationMesh resource must be set or created for this node to work."
msgstr ""
"Cal crear o establir un recurs de tipus NavigationMesh per al correcte "
@ -6184,9 +6047,6 @@ msgstr "Desinstal·lant..."
msgid "Could not install to device: %s"
msgstr "No s'ha pogut instal·lar al dispositiu: %s"
msgid "Signing release %s..."
msgstr "S'està signant la versió %s ..."
msgid "Could not write expansion package file!"
msgstr "No s'ha pogut escriure el fitxer del paquet d'expansió!"
@ -6266,8 +6126,5 @@ msgstr ""
msgid "Invalid source for shader."
msgstr "Font no vàlida pel Shader."
msgid "Filter"
msgstr "Filtre"
msgid "Constants cannot be modified."
msgstr "Les constants no es poden modificar."

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -31,13 +31,15 @@
# Diego22rct <diegorafaelcisnerostafur@gmail.com>, 2024.
# Carlos Mena <menacarlos.asir@gmail.com>, 2024.
# Franco Ezequiel Ibañez <francoibanez.dev@gmail.com>, 2024.
# David Pepice <davitogaming@gmail.com>, 2025.
# LCDF <lcdf1001@gmail.com>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor interface\n"
"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2024-03-18 13:37+0000\n"
"Last-Translator: Franco Ezequiel Ibañez <francoibanez.dev@gmail.com>\n"
"PO-Revision-Date: 2025-01-29 23:00+0000\n"
"Last-Translator: LCDF <lcdf1001@gmail.com>\n"
"Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/godot-"
"engine/godot/es_AR/>\n"
"Language: es_AR\n"
@ -45,7 +47,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 5.5-dev\n"
"X-Generator: Weblate 5.10-dev\n"
msgid "Main Thread"
msgstr "Hilo Principal"
@ -197,6 +199,9 @@ msgstr "Bottón de Joypad %d"
msgid "Pressure:"
msgstr "Presión:"
msgid "touched"
msgstr "tocado"
msgid "released"
msgstr "Publicado"
@ -474,6 +479,9 @@ msgstr "Filtrar por nombre"
msgid "Clear All"
msgstr "Limpiar Todo"
msgid "Clear all search filters."
msgstr "Borrar todos los filtros de búsqueda"
msgid "Add New Action"
msgstr "Agregar Acción Nueva"
@ -489,6 +497,12 @@ msgstr "Acción"
msgid "Deadzone"
msgstr "Zona muerta"
msgid "Name:"
msgstr "Nombre:"
msgid "Type:"
msgstr "Tipo:"
msgid "Time:"
msgstr "Tiempo:"
@ -603,16 +617,6 @@ msgstr "Cambiar Duración de la Animación"
msgid "Change Animation Loop"
msgstr "Cambiar Loop de Animación"
msgid "Can't change loop mode on animation instanced from imported scene."
msgstr ""
"No se puede cambiar el modo de bucle en una animación creada a partir de una "
"escena importada."
msgid "Can't change loop mode on animation embedded in another scene."
msgstr ""
"No se puede cambiar el modo de bucle en una animación insertada en otra "
"escena."
msgid "Property Track..."
msgstr "Pista de Propiedades..."
@ -697,9 +701,6 @@ msgstr "Escala:"
msgid "Blend Shape:"
msgstr "Forma Combinada:"
msgid "Type:"
msgstr "Tipo:"
msgid "(Invalid, expected type: %s)"
msgstr "(Inválido, tipo esperado: %s)"
@ -845,9 +846,6 @@ msgstr "Mostrar solo las pistas de los nodos seleccionados en el árbol."
msgid "Group tracks by node or display them as plain list."
msgstr "Agrupar las pistas por nodo o mostrarlas como una lista plana."
msgid "Snap:"
msgstr "Ajuste:"
msgid "Animation step value."
msgstr "Valor de paso de animación."
@ -912,6 +910,12 @@ msgstr "Elegir Pistas a Copiar"
msgid "Select All/None"
msgstr "Seleccionar Todo/Ninguno"
msgid "Close"
msgstr "Cerrar"
msgid "Error!"
msgstr "Error!"
msgid "Add Audio Track Clip"
msgstr "Agregar Clip de Pista de Audio"
@ -1024,9 +1028,6 @@ msgstr "Desconecta la señal después de su primera emisión."
msgid "Cannot connect signal"
msgstr "No se puede conectar la señal"
msgid "Close"
msgstr "Cerrar"
msgid "Connect"
msgstr "Conectar"
@ -1112,6 +1113,9 @@ msgstr "Instancia:"
msgid "Toggle Visibility"
msgstr "Act/Desact. Visibilidad"
msgid "Clear"
msgstr "Limpiar"
msgid "Monitors"
msgstr "Monitores"
@ -1130,9 +1134,6 @@ msgstr "Detener"
msgid "Start"
msgstr "Iniciar"
msgid "Clear"
msgstr "Limpiar"
msgid "Measure:"
msgstr "Medida:"
@ -1376,12 +1377,6 @@ msgstr "Es Dueño De"
msgid "Resources Without Explicit Ownership:"
msgstr "Recursos Sin Propietario Explícito:"
msgid "Could not create folder."
msgstr "No se pudo crear la carpeta."
msgid "Create Folder"
msgstr "Crear Carpeta"
msgid "Thanks from the Godot community!"
msgstr "Gracias de parte de la comunidad Godot!"
@ -1542,12 +1537,6 @@ msgstr "Ubicación para el Nuevo Layout..."
msgid "Open Audio Bus Layout"
msgstr "Abrir Layout de Bus de Audio"
msgid "There is no '%s' file."
msgstr "No hay ningún archivo '%s'."
msgid "Invalid file, not an audio bus layout."
msgstr "Archivo inválido. No es un layout de bus de audio."
msgid "Error saving file: %s"
msgstr "Error guardando el archivo: %s"
@ -1887,20 +1876,14 @@ msgstr ""
msgid "Editor"
msgstr "Editor"
msgid "Property:"
msgstr "Propiedad:"
msgid "Show in FileSystem"
msgstr "Mostrar en Sistema de Archivos"
msgid "Signal:"
msgstr "Señal:"
msgid "Open in File Manager"
msgstr "Abrir en el Explorador de Archivos"
msgid "%d matches."
msgstr "%d coincidencias."
msgid "Method"
msgstr "Método"
msgid "Signal"
msgstr "Señal"
msgid "Class"
msgstr "Clase"
msgid "Constant"
msgstr "Constante"
@ -1911,6 +1894,18 @@ msgstr "Propiedad"
msgid "Theme Property"
msgstr "Propiedades del Tema"
msgid "Method"
msgstr "Método"
msgid "Signal"
msgstr "Señal"
msgid "File"
msgstr "Archivo"
msgid "%d matches."
msgstr "%d coincidencias."
msgid "Search Help"
msgstr "Buscar en la Ayuda"
@ -1944,9 +1939,6 @@ msgstr "Solo Propiedades de Tema"
msgid "Member Type"
msgstr "Tipo de Miembro"
msgid "Class"
msgstr "Clase"
msgid "Pinning a value forces it to be saved even if it's equal to the default."
msgstr ""
"Fijar un valor fuerza que sea guardado incluso si es igual predeterminado."
@ -1966,8 +1958,8 @@ msgstr "Asignar %s"
msgid "Unpinned %s"
msgstr "Desfijado %s"
msgid "Name:"
msgstr "Nombre:"
msgid "Favorites"
msgstr "Favoritos"
msgid "Copy Property Path"
msgstr "Copiar Ruta de Propiedad"
@ -2094,15 +2086,6 @@ msgstr ""
msgid "Open Base Scene"
msgstr "Abrir Escena Base"
msgid "Quick Open..."
msgstr "Apertura Rápida..."
msgid "Quick Open Scene..."
msgstr "Apertura Rápida de Escena..."
msgid "Quick Open Script..."
msgstr "Apertura Rápida de Script..."
msgid ""
"A root node is required to save the scene. You can add a root node using the "
"Scene tree dock."
@ -2113,9 +2096,6 @@ msgstr ""
msgid "Save Scene As..."
msgstr "Guardar Escena Como..."
msgid "Current scene not saved. Open anyway?"
msgstr "Escena actual sin guardar. Abrir de todos modos?"
msgid "Can't undo while mouse buttons are pressed."
msgstr "No se puede deshacer mientras los botones del mouse están presionados."
@ -2190,34 +2170,6 @@ msgstr "La escena '%s' tiene dependencias rotas:"
msgid "Clear Recent Scenes"
msgstr "Restablecer Escenas Recientes"
msgid ""
"No main scene has ever been defined, select one?\n"
"You can change it later in \"Project Settings\" under the 'application' "
"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'."
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 ""
"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'."
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 ""
"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'."
msgid "Default"
msgstr "Por Defecto"
@ -2287,6 +2239,15 @@ msgstr "Abrir Reciente"
msgid "Save Scene"
msgstr "Guardar Escena"
msgid "Quick Open..."
msgstr "Apertura Rápida..."
msgid "Quick Open Scene..."
msgstr "Apertura Rápida de Escena..."
msgid "Quick Open Script..."
msgstr "Apertura Rápida de Script..."
msgid "MeshLibrary..."
msgstr "MeshLibrary..."
@ -2409,13 +2370,6 @@ msgstr "Exportar Libreria"
msgid "Open & Run a Script"
msgstr "Abrir y Correr un Script"
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?"
msgid "New Inherited"
msgstr "Nuevo Heredado"
@ -2525,9 +2479,6 @@ msgstr "Convertir en Unico"
msgid "Save As..."
msgstr "Guardar Como..."
msgid "Show in FileSystem"
msgstr "Mostrar en Sistema de Archivos"
msgid "Convert to %s"
msgstr "Convertir a %s"
@ -2549,6 +2500,9 @@ msgstr ""
msgid "Write your logic in the _run() method."
msgstr "Escribir tu lógica en el método _run()."
msgid "None"
msgstr "Ninguno"
msgid "Editor Settings"
msgstr "Configuración del Editor"
@ -2741,6 +2695,16 @@ msgstr "Importando:"
msgid "Remove templates for the version '%s'?"
msgstr "¿Quitar plantillas para la versión '%s'?"
msgid "Export templates are missing. Download them or install from a file."
msgstr ""
"Faltan las plantillas de exportación. Descargalas o instalalas desde un "
"archivo."
msgid "Official export templates aren't available for development builds."
msgstr ""
"Las plantillas de exportación oficiales no están disponibles para las "
"versiones de desarrollo."
msgid "Uncompressing Android Build Sources"
msgstr "Descomprimiendo Fuentes de Compilación Android"
@ -2750,11 +2714,6 @@ msgstr "Gestor de Plantillas de Exportación"
msgid "Current Version:"
msgstr "Version Actual:"
msgid "Export templates are missing. Download them or install from a file."
msgstr ""
"Faltan las plantillas de exportación. Descargalas o instalalas desde un "
"archivo."
msgid "Export templates are installed and ready to be used."
msgstr ""
"Las plantillas de exportación están instaladas y listas para ser usadas."
@ -2792,11 +2751,6 @@ msgstr ""
"Descargar e instalar plantillas para la versión actual de el mejor mirror "
"posible."
msgid "Official export templates aren't available for development builds."
msgstr ""
"Las plantillas de exportación oficiales no están disponibles para las "
"versiones de desarrollo."
msgid "Install from File"
msgstr "Instalar desde Archivo"
@ -2930,9 +2884,6 @@ msgstr "Gestionar Plantillas de Exportación"
msgid "Browse"
msgstr "Examinar"
msgid "Favorites"
msgstr "Favoritos"
msgid "View items as a grid of thumbnails."
msgstr "Ver ítems como una grilla de miniaturas."
@ -2983,6 +2934,9 @@ msgstr "Duplicando archivo:"
msgid "Duplicating folder:"
msgstr "Duplicando carpeta:"
msgid "Create Folder"
msgstr "Crear Carpeta"
msgid "New Inherited Scene"
msgstr "Nueva Escena Heredada"
@ -3004,9 +2958,6 @@ msgstr "Quitar de Favoritos"
msgid "Reimport"
msgstr "Reimportar"
msgid "Open in File Manager"
msgstr "Abrir en el Explorador de Archivos"
msgid "New Folder..."
msgstr "Nueva Carpeta..."
@ -3117,12 +3068,6 @@ msgstr "Seleccionar Carpeta Actual"
msgid "Select This Folder"
msgstr "Seleccionar Esta Carpeta"
msgid "All Recognized"
msgstr "Todos Reconocidos"
msgid "All Files (*)"
msgstr "Todos los Archivos (*)"
msgid "Open a File"
msgstr "Abrir un Archivo"
@ -3138,6 +3083,9 @@ msgstr "Abrir un Archivo o Directorio"
msgid "Save a File"
msgstr "Guardar un Archivo"
msgid "Could not create folder."
msgstr "No se pudo crear la carpeta."
msgid "Go Back"
msgstr "Retroceder"
@ -3180,12 +3128,12 @@ msgstr "Refrescar archivos."
msgid "(Un)favorite current folder."
msgstr "Quitar carpeta actual de favoritos."
msgid "Toggle the visibility of hidden files."
msgstr "Mostrar/Ocultar archivos ocultos."
msgid "Directories & Files:"
msgstr "Directorios y Archivos:"
msgid "Toggle the visibility of hidden files."
msgstr "Mostrar/Ocultar archivos ocultos."
msgid "Preview:"
msgstr "Vista Previa:"
@ -3204,8 +3152,8 @@ msgstr "Reproducir el proyecto."
msgid "Play the edited scene."
msgstr "Reproducir la escena editada."
msgid "Quick Run Scene..."
msgstr "Ejecución Rápida de Escena..."
msgid "Network Profiler"
msgstr "Profiler de Red"
msgid "Run Project"
msgstr "Reproducir Proyecto"
@ -3392,18 +3340,9 @@ msgstr "Abrir la documentación para este objeto."
msgid "Manage object properties."
msgstr "Administrar propiedades del objeto."
msgid "Add %d Translations"
msgstr "Añadir %d Traducciones"
msgid "Remove Translation"
msgstr "Quitar Traducción"
msgid "Translation Resource Remap: Add %d Path(s)"
msgstr "Remapeo de Recursos de Traducción: Añadir %d Ruta(s)"
msgid "Translation Resource Remap: Add %d Remap(s)"
msgstr "Remapeo de Recursos de Traducción: Añadir %d Remapeo(s)"
msgid "Change Resource Remap Language"
msgstr "Cambiar Lenguaje de Remapeo de Recursos"
@ -3658,20 +3597,6 @@ msgstr "Blendear Próximo Cambiado"
msgid "Change Blend Time"
msgstr "Cambiar Tiempo de Blend"
msgid "Play selected animation backwards from current pos. (A)"
msgstr ""
"Reproducir hacia atras la animación seleccionada desde la posicion actual (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr ""
"Reproducir hacia atrás la animación seleccionada desde el final. (Shift+A)"
msgid "Play selected animation from start. (Shift+D)"
msgstr "Reproducir animación seleccinada desde el principio. (Shift + D)"
msgid "Play selected animation from current pos. (D)"
msgstr "Reproducir animación seleccionada desde la posicion actual. (D)"
msgid "Animation position (in seconds)."
msgstr "Posición de animación (en segundos)."
@ -3732,9 +3657,6 @@ msgstr "Incluir Gizmos (3D)"
msgid "Pin AnimationPlayer"
msgstr "Fijar AnimationPlayer"
msgid "Error!"
msgstr "Error!"
msgid "Cross-Animation Blend Times"
msgstr "Tiempos de Blending Entre Animaciones"
@ -4017,23 +3939,6 @@ msgstr "Bloqueado"
msgid "Grouped"
msgstr "Agrupado"
msgid ""
"Project Camera Override\n"
"Overrides the running project's camera with the editor viewport camera."
msgstr ""
"Reemplazar Cámara del Proyecto\n"
"Reemplaza la cámara del proyecto en ejecución con la cámara del viewport del "
"editor."
msgid ""
"Project Camera Override\n"
"No project instance running. Run the project from the editor to use this "
"feature."
msgstr ""
"Reemplazo de la Cámara de Proyecto\n"
"No se está ejecutando ninguna instancia del proyecto. Ejecutá el proyecto "
"desde el editor para utilizar esta función."
msgid "Lock Selected"
msgstr "Bloqueo Seleccionado"
@ -4309,30 +4214,6 @@ msgstr "Derecha Ancha"
msgid "Full Rect"
msgstr "Todo el Rect"
msgid "Load Emission Mask"
msgstr "Cargar Máscara de Emisión"
msgid "Emission Mask"
msgstr "Máscara de Emisión"
msgid "Solid Pixels"
msgstr "Pixeles Sólidos"
msgid "Border Pixels"
msgstr "Píxeles del Borde"
msgid "Directed Border Pixels"
msgstr "Píxeles del Borde Directos"
msgid "Generate Visibility AABB"
msgstr "Generar AABB de Visibilidad"
msgid "Create Emission Points From Node"
msgstr "Crear Puntos de Emisión Desde Nodo"
msgid "Generation Time (sec):"
msgstr "Tiempo de Generación (seg):"
msgid "Load Curve Preset"
msgstr "Cargar Preset de Curva"
@ -4473,39 +4354,6 @@ msgstr "Cambiar Radio de Luces"
msgid "Change Notifier AABB"
msgstr "Cambiar Notificador AABB"
msgid "Convert to CPUParticles2D"
msgstr "Convertir a CPUParticles2D"
msgid "Generate Visibility Rect"
msgstr "Generar Rect. de Visibilidad"
msgid "The geometry's faces don't contain any area."
msgstr "Las caras de la geometría no contienen ningún área."
msgid "The geometry doesn't contain any faces."
msgstr "La geometría no contiene ninguna cara."
msgid "\"%s\" doesn't contain geometry."
msgstr "\"%s\" no contiene geometría."
msgid "\"%s\" doesn't contain face geometry."
msgstr "\"%s\" no tiene geometría de caras."
msgid "Create Emitter"
msgstr "Crear Emisor"
msgid "Emission Points:"
msgstr "Puntos de Emisión:"
msgid "Surface Points"
msgstr "Puntos de Superficie"
msgid "Surface Points+Normal (Directed)"
msgstr "Puntos de Superficia+Normal (Dirigida)"
msgid "Volume"
msgstr "Volumen"
msgid "Create Occluder Polygon"
msgstr "Crear Polígono Oclusor"
@ -4517,11 +4365,6 @@ msgstr ""
"lightmaps.\n"
"Guardá tu escena e inténtalo de nuevo."
msgid "Failed creating lightmap images, make sure path is writable."
msgstr ""
"Error al crear imagenes de lightmap. Asegurate que la ruta tenga permiso de "
"escritura."
msgid "Bake Lightmaps"
msgstr "Bake Lightmaps"
@ -4537,9 +4380,6 @@ msgstr "No se pudo crear ninguna forma de colisión."
msgid "Mesh is empty!"
msgstr "¡El Mesh está vacío!"
msgid "Create Navigation Mesh"
msgstr "Crear Navigation Mesh"
msgid "Contained Mesh is not of type ArrayMesh."
msgstr "El Mesh contenedor no es del tipo ArrayMesh."
@ -4552,6 +4392,9 @@ msgstr "No hay meshes para depurar."
msgid "Mesh has no UV in layer %d."
msgstr "La malla no tiene UV en la capa %d."
msgid "Create Navigation Mesh"
msgstr "Crear Navigation Mesh"
msgid "Create Outline"
msgstr "Crear Outline"
@ -4706,11 +4549,8 @@ msgstr "Cantidad:"
msgid "Populate"
msgstr "Poblar"
msgid "Edit Poly"
msgstr "Editar Polígono"
msgid "Edit Poly (Remove Point)"
msgstr "Editar Polígono (Remover Punto)"
msgid "Please Confirm..."
msgstr "Confirmá, por favor..."
msgid "Create Navigation Polygon"
msgstr "Crear Polígono de Navegación"
@ -4763,9 +4603,6 @@ msgstr "Ortogonal Trasera"
msgid "Rear Perspective"
msgstr "Perspectiva Trasera"
msgid " [auto]"
msgstr " [auto]"
msgid "X-Axis Transform."
msgstr "Transformación en Eje-X."
@ -4808,9 +4645,6 @@ msgstr "Alinear Transform con Vista"
msgid "Align Rotation with View"
msgstr "Alinear Rotación con Vista"
msgid "None"
msgstr "Ninguno"
msgid "Rotate"
msgstr "Rotar"
@ -5059,6 +4893,63 @@ msgstr "Pre"
msgid "Post"
msgstr "Post"
msgid "Generate Visibility Rect"
msgstr "Generar Rect. de Visibilidad"
msgid "Load Emission Mask"
msgstr "Cargar Máscara de Emisión"
msgid "Solid Pixels"
msgstr "Pixeles Sólidos"
msgid "Border Pixels"
msgstr "Píxeles del Borde"
msgid "Directed Border Pixels"
msgstr "Píxeles del Borde Directos"
msgid "Emission Mask"
msgstr "Máscara de Emisión"
msgid "Convert to CPUParticles2D"
msgstr "Convertir a CPUParticles2D"
msgid "Generation Time (sec):"
msgstr "Tiempo de Generación (seg):"
msgid "Generate Visibility AABB"
msgstr "Generar AABB de Visibilidad"
msgid "\"%s\" doesn't contain geometry."
msgstr "\"%s\" no contiene geometría."
msgid "\"%s\" doesn't contain face geometry."
msgstr "\"%s\" no tiene geometría de caras."
msgid "Create Emission Points From Node"
msgstr "Crear Puntos de Emisión Desde Nodo"
msgid "The geometry's faces don't contain any area."
msgstr "Las caras de la geometría no contienen ningún área."
msgid "The geometry doesn't contain any faces."
msgstr "La geometría no contiene ninguna cara."
msgid "Create Emitter"
msgstr "Crear Emisor"
msgid "Emission Points:"
msgstr "Puntos de Emisión:"
msgid "Surface Points"
msgstr "Puntos de Superficie"
msgid "Surface Points+Normal (Directed)"
msgstr "Puntos de Superficia+Normal (Dirigida)"
msgid "Volume"
msgstr "Volumen"
msgid "Remove Point from Curve"
msgstr "Remover Punto de Curva"
@ -5095,9 +4986,6 @@ msgstr "Eliminar Punto"
msgid "Close Curve"
msgstr "Cerrar Curva"
msgid "Please Confirm..."
msgstr "Confirmá, por favor..."
msgid "Mirror Handle Angles"
msgstr "Manejadores de Ángulos de Espejo"
@ -5156,13 +5044,6 @@ msgstr "La propiedad esqueleto del Polygon2D no apunta a un nodo Skeleton2D"
msgid "Sync Bones"
msgstr "Sincronizar Huesos"
msgid ""
"No texture in this polygon.\n"
"Set a texture to be able to edit UV."
msgstr ""
"Sin textura en este nodo.\n"
"Asigná una textura para poder editar el UV."
msgid "Create UV Map"
msgstr "Crear Mapa UV"
@ -5200,21 +5081,15 @@ msgstr "Transformar Polígono"
msgid "Paint Bone Weights"
msgstr "Pintar Peso de Huesos"
msgid "Open Polygon 2D UV editor."
msgstr "Abrir editor UV de Polígonos 2D."
msgid "Polygon 2D UV Editor"
msgstr "Editor UV de Polígonos 2D"
msgid "UV"
msgstr "UV"
msgid "Points"
msgstr "Puntos"
msgid "Polygons"
msgstr "Polígonos"
msgid "UV"
msgstr "UV"
msgid "Bones"
msgstr "Huesos"
@ -5289,6 +5164,12 @@ msgstr "Sincronizar Huesos con el Polígono"
msgid "Create Polygon3D"
msgstr "Crear Polygon3D"
msgid "Edit Poly"
msgstr "Editar Polígono"
msgid "Edit Poly (Remove Point)"
msgstr "Editar Polígono (Remover Punto)"
msgid "ERROR: Couldn't load resource!"
msgstr "ERROR: No se pudo cargar el recurso!"
@ -5367,9 +5248,6 @@ msgstr "Script Siguiente"
msgid "Previous Script"
msgstr "Script Anterior"
msgid "File"
msgstr "Archivo"
msgid "Open..."
msgstr "Abrir..."
@ -5460,9 +5338,6 @@ msgstr "[Ignorar]"
msgid "Go to Function"
msgstr "Ir a Función"
msgid "Lookup Symbol"
msgstr "Buscar Símbolo"
msgid "Pick Color"
msgstr "Seleccionar Color"
@ -5541,6 +5416,9 @@ msgstr "Ir a Función..."
msgid "Go to Line..."
msgstr "Ir a Línea..."
msgid "Lookup Symbol"
msgstr "Buscar Símbolo"
msgid "Toggle Breakpoint"
msgstr "Act/Desact. Breakpoint"
@ -5658,6 +5536,20 @@ msgstr "Animaciones:"
msgid "Animation Frames:"
msgstr "Fotogramas de animación:"
msgid "Play selected animation backwards from current pos. (A)"
msgstr ""
"Reproducir hacia atras la animación seleccionada desde la posicion actual (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr ""
"Reproducir hacia atrás la animación seleccionada desde el final. (Shift+A)"
msgid "Play selected animation from start. (Shift+D)"
msgstr "Reproducir animación seleccinada desde el principio. (Shift + D)"
msgid "Play selected animation from current pos. (D)"
msgstr "Reproducir animación seleccionada desde la posicion actual. (D)"
msgid "Zoom Reset"
msgstr "Reset de Zoom"
@ -5667,6 +5559,9 @@ msgstr "Seleccionar Frames"
msgid "Size"
msgstr "Tamaño"
msgid "Auto Slice"
msgstr "Corte Automático"
msgid "Create Frames from Sprite Sheet"
msgstr "Crear Frames a partir de Sprite Sheet"
@ -5691,9 +5586,6 @@ msgstr "Ajustar a Pixeles"
msgid "Grid Snap"
msgstr "Ajustar a Grilla"
msgid "Auto Slice"
msgstr "Corte Automático"
msgid "Step:"
msgstr "Paso:"
@ -6884,18 +6776,9 @@ msgstr "Error al abrir el archivo comprimido, no está en formato ZIP."
msgid "The following files failed extraction from package:"
msgstr "Los siguientes archivos no se pudieron extraer del paquete:"
msgid "Import & Edit"
msgstr "Importar y Editar"
msgid "Create & Edit"
msgstr "Crear y Editar"
msgid "Install Project:"
msgstr "Instalar Proyecto:"
msgid "Install & Edit"
msgstr "Instalar y Editar"
msgid "Project Name:"
msgstr "Nombre del Proyecto:"
@ -7309,36 +7192,12 @@ msgstr "Ruta base inválida."
msgid "Wrong extension chosen."
msgstr "Extensión incorrecta elegida."
msgid "Change Cylinder Radius"
msgstr "Cambiar Radio de Cilindro"
msgid "Change Cylinder Height"
msgstr "Cambiar Altura de Cilindro"
msgid "Change Torus Inner Radius"
msgstr "Cambiar Radio Interno de Toro"
msgid "Change Torus Outer Radius"
msgstr "Cambiar Radio Externo de Toro"
msgid "Next Plane"
msgstr "Plano siguiente"
msgid "Previous Plane"
msgstr "Plano anterior"
msgid "Plane:"
msgstr "Plano:"
msgid "Next Floor"
msgstr "Piso Siguiente"
msgid "Previous Floor"
msgstr "Piso Anterior"
msgid "Floor:"
msgstr "Piso:"
msgid "GridMap Delete Selection"
msgstr "Eliminar Seleccionados en GridMap"
@ -7354,6 +7213,12 @@ msgstr "Pintar GridMap"
msgid "GridMap Selection"
msgstr "Selección de GridMap"
msgid "Previous Floor"
msgstr "Piso Anterior"
msgid "Next Floor"
msgstr "Piso Siguiente"
msgid "Edit X Axis"
msgstr "Editar Eje X"
@ -7363,6 +7228,12 @@ msgstr "Editar Eje Y"
msgid "Edit Z Axis"
msgstr "Editar Eje Z"
msgid "GridMap Settings"
msgstr "Ajustes de GridMap"
msgid "Pick Distance:"
msgstr "Elegir Instancia:"
msgid "Cursor Rotate X"
msgstr "Rotar X en Cursor"
@ -7372,39 +7243,6 @@ msgstr "Rotar Y en Cursor"
msgid "Cursor Rotate Z"
msgstr "Rotar Z en Cursor"
msgid "Cursor Back Rotate X"
msgstr "Rotación Inversa X en Cursor"
msgid "Cursor Back Rotate Y"
msgstr "Rotación Inversa Y en Cursor"
msgid "Cursor Back Rotate Z"
msgstr "Rotación Inversa Z en Cursor"
msgid "Cursor Clear Rotation"
msgstr "Restablecer Rotación en Cursor"
msgid "Paste Selects"
msgstr "Seleccionar al Pegar"
msgid "Cut Selection"
msgstr "Cortar Selección"
msgid "Clear Selection"
msgstr "Limpiar Selección"
msgid "Fill Selection"
msgstr "Llenar la Selección"
msgid "Grid Map"
msgstr "Mapa de Grilla"
msgid "GridMap Settings"
msgstr "Ajustes de GridMap"
msgid "Pick Distance:"
msgstr "Elegir Instancia:"
msgid "Give a MeshLibrary resource to this GridMap to use its meshes."
msgstr "Asignar un recurso MeshLibrary a este GridMap para usar sus meshes."
@ -7430,9 +7268,6 @@ msgstr "RPC Saliente"
msgid "Config"
msgstr "Configuraciones"
msgid "Network Profiler"
msgstr "Profiler de Red"
msgid "A NavigationMesh resource must be set or created for this node to work."
msgstr ""
"Se debe crear o setear un recurso NavigationMesh para que este nodo funcione."
@ -7522,32 +7357,12 @@ msgid "Unable to find Android SDK build-tools' apksigner command."
msgstr ""
"No se pudo encontrar el comando apksigner en las Android SDK build-tools."
msgid ""
"'apksigner' could not be found. Please check that the command is available in "
"the Android SDK build-tools directory. The resulting %s is unsigned."
msgstr ""
"No se ha encontrado 'apksigner'. Por favor, comprobá que el comando esté "
"disponible en el directorio Android SDK build-tools. El %s resultante está "
"sin firmar."
msgid "Signing debug %s..."
msgstr "Firmando %s debug..."
msgid "Signing release %s..."
msgstr "Firmando %s release..."
msgid "Could not find keystore, unable to export."
msgstr "No se pudo encontrar la keystore, no se puedo exportar."
msgid "'apksigner' returned with error #%d"
msgstr "'apksigner' ha retornado con error #%d"
msgid "Verifying %s..."
msgstr "Verificando %s..."
msgid "'apksigner' verification of %s failed."
msgstr "La verificación de 'apksigner' de %s ha fallado."
msgid "Exporting for Android"
msgstr "Exportando para Android"
@ -7768,14 +7583,6 @@ msgstr ""
"Se debe proveer un shape para que CollisionShape2D funcione. Creale un "
"recurso shape!"
msgid ""
"Polygon-based shapes are not meant be used nor edited directly through the "
"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
msgstr ""
"Las formas basadas en polígonos no están pensadas para ser usadas ni editadas "
"directamente a través del nodo CollisionShape2D. Por favor, usá el nodo "
"CollisionPolygon2D en su lugar."
msgid "Node A and Node B must be PhysicsBody2Ds"
msgstr "El nodo A y el nodo B deben ser PhysicsBody2D"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -14,19 +14,21 @@
# ninjum <ninhum@gmx.com>, 2024.
# spukes <soyceltista@hotmail.com>, 2024.
# "Aquiles T. M." <aquiles.sonido@gmail.com>, 2024.
# Guachipoto <guachipoto993@gmail.com>, 2024.
# "Miguel A. Bouzada" <mbouzada@gmail.com>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor interface\n"
"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n"
"PO-Revision-Date: 2024-09-05 14:09+0000\n"
"Last-Translator: \"Aquiles T. M.\" <aquiles.sonido@gmail.com>\n"
"PO-Revision-Date: 2025-02-06 23:02+0000\n"
"Last-Translator: \"Miguel A. Bouzada\" <mbouzada@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 5.8-dev\n"
"X-Generator: Weblate 5.10-dev\n"
msgid "Main Thread"
msgstr "Fío principal"
@ -38,49 +40,49 @@ msgid "Physical"
msgstr "Físico"
msgid "Left Mouse Button"
msgstr "Botón Esquerdo do Rato"
msgstr "Botón esquerdo do rato"
msgid "Right Mouse Button"
msgstr "Botón Dereito do Rato"
msgstr "Botón dereito do rato"
msgid "Middle Mouse Button"
msgstr "Botón Central do Rato"
msgstr "Botón central do rato"
msgid "Mouse Wheel Up"
msgstr "Roda do Rato Cara Arriba"
msgstr "Roda do rato cara arriba"
msgid "Mouse Wheel Down"
msgstr "Roda do Rato Cara Abaixo"
msgstr "Roda do rato cara abaixo"
msgid "Mouse Wheel Left"
msgstr "Roda do Rato Cara a Esquerda"
msgstr "Roda do rato cara a esquerda"
msgid "Mouse Wheel Right"
msgstr "Roda do Rato Cara a Dereita"
msgstr "Roda do rato cara a dereita"
msgid "Mouse Thumb Button 1"
msgstr "Botón do Rato Polgar 1"
msgstr "Botón de Polgar do Rato 1"
msgid "Mouse Thumb Button 2"
msgstr "Botón do Rato Polgar 2"
msgstr "Botón de Polgar do Rato 2"
msgid "Button"
msgstr "Botón"
msgid "Double Click"
msgstr "Dobre clic"
msgstr "Duplo Clic"
msgid "Mouse motion at position (%s) with velocity (%s)"
msgstr "Movemento do rato na posición (%s) con velocidade (%s)"
msgid "Left Stick X-Axis, Joystick 0 X-Axis"
msgstr "Eixe X da Panca Esquerda, Eixe X do Joystick 0"
msgstr "Eixo X da Panca Esquerda, Eixo X do Joystick 0"
msgid "Left Stick Y-Axis, Joystick 0 Y-Axis"
msgstr "Eixe Y da Panca Esquerda, Eixe Y do Joystick 0"
msgstr "Eixo Y da Panca Esquerda, Eixo Y do Joystick 0"
msgid "Right Stick X-Axis, Joystick 1 X-Axis"
msgstr "Eixe X da Panca Dereita, Eixe X do Joystick 1"
msgstr "Eixo X da Panca Dereita, Eixo X do Joystick 1"
msgid "Right Stick Y-Axis, Joystick 1 Y-Axis"
msgstr "Eixe Y da Panca Dereita, Eixe Y do Joystick 1"
@ -488,6 +490,12 @@ msgstr "Acción"
msgid "Deadzone"
msgstr "Zona morta"
msgid "Name:"
msgstr "Nome:"
msgid "Type:"
msgstr "Tipo:"
msgid "Time:"
msgstr "Tempo:"
@ -599,15 +607,6 @@ msgstr "Cambiar Lonxitude da Animación"
msgid "Change Animation Loop"
msgstr "Cambiar Ciclo da Animación"
msgid "Can't change loop mode on animation instanced from imported scene."
msgstr ""
"Non se pode cambiar o modo de bucle nunha animación creada a partires dunha "
"escena importada."
msgid "Can't change loop mode on animation embedded in another scene."
msgstr ""
"Non se pode cambiar o modo de bucle na animación incorporada noutra escena."
msgid "Property Track..."
msgstr "Pista de Propiedades..."
@ -692,9 +691,6 @@ msgstr "Escala:"
msgid "Blend Shape:"
msgstr "Forma Combinada:"
msgid "Type:"
msgstr "Tipo:"
msgid "(Invalid, expected type: %s)"
msgstr "(Inválido, tipo esperado: %s)"
@ -980,9 +976,6 @@ msgstr "Só mostrar pistas de nodos seleccionados na árbore."
msgid "Group tracks by node or display them as plain list."
msgstr "Agrupar pistas por nodo ou mostralas coma unha simple lista."
msgid "Snap:"
msgstr "Axuste de Cuadrícula:"
msgid "Animation step value."
msgstr "Valor de paso de animación."
@ -1103,6 +1096,12 @@ msgstr "Seleccionar Todas/Ningunha"
msgid "Animation Change Keyframe Time"
msgstr "Cambiar Tempo do Fotograma Clave da Animación"
msgid "Close"
msgstr "Pechar"
msgid "Error!"
msgstr "Erro!"
msgid "Add Audio Track Clip"
msgstr "Engadir Clip de Pista de Audio"
@ -1249,9 +1248,6 @@ msgstr "Desconecta a sinal unha vez foi emitida por primeira vez."
msgid "Cannot connect signal"
msgstr "No se pode conectar a sinal"
msgid "Close"
msgstr "Pechar"
msgid "Connect"
msgstr "Conectar"
@ -1348,6 +1344,9 @@ msgstr "Copiar Ruta do Nodo"
msgid "Instance:"
msgstr "Instancia:"
msgid "Clear"
msgstr "Limpar"
msgid "Decompressing remote file system"
msgstr "Descomprimindo sistema de ficheiros remoto"
@ -1372,9 +1371,6 @@ msgstr "Deter"
msgid "Start"
msgstr "Iniciar"
msgid "Clear"
msgstr "Limpar"
msgid "Measure:"
msgstr "Medida:"
@ -1595,27 +1591,12 @@ msgstr "O nome do cartafol non pode estar baleiro."
msgid "Folder name contains invalid characters."
msgstr "O nome do cartafol contén caracteres non válidos."
msgid "Folder name cannot begin or end with a space."
msgstr "O nome do cartafol non pode comezar nin rematar cun espazo."
msgid "Folder name cannot begin with a dot."
msgstr "O nome do cartafol non pode comezar cun punto."
msgid "File with that name already exists."
msgstr "Un ficheiro con ese nome xa existe."
msgid "Folder with that name already exists."
msgstr "Un cartafol con ese nome xa existe."
msgid "Could not create folder."
msgstr "Non se puido crear cartafol."
msgid "Create new folder in %s:"
msgstr "Crear un novo cartafol en %s:"
msgid "Create Folder"
msgstr "Crear Cartafol"
msgid "Folder name is valid."
msgstr "O nome do cartafol é válido."
@ -1625,9 +1606,6 @@ msgstr "Dobre-clic para abrir no navegador."
msgid "Thanks from the Godot community!"
msgstr "Moitas grazas de parte da comunidade de Godot!"
msgid "(unknown)"
msgstr "(descoñecido)"
msgid "Godot Engine contributors"
msgstr "Colaboradores de Godot Engine"
@ -1810,18 +1788,12 @@ msgstr "Localización para a Nova Disposición..."
msgid "Open Audio Bus Layout"
msgstr "Abrir Disposición do Bus de Son"
msgid "There is no '%s' file."
msgstr "Non hai ningún arquivo '%s'."
msgid "Error saving file: %s"
msgstr "Erro gardando o arquivo: %s"
msgid "Layout:"
msgstr "Disposición:"
msgid "Invalid file, not an audio bus layout."
msgstr "Arquivo invalido; non é unha disposición dun Bus de son."
msgid "Error saving file: %s"
msgstr "Erro gardando o arquivo: %s"
msgid "Add Bus"
msgstr "Engadir Bus"
@ -2179,20 +2151,14 @@ msgstr ""
msgid "Editor"
msgstr "Editor"
msgid "Property:"
msgstr "Propiedade:"
msgid "Show in FileSystem"
msgstr "Amosar no Sistema de Arquivos"
msgid "Signal:"
msgstr "Sinal:"
msgid "Open in File Manager"
msgstr "Abrir no Explorador de Arquivos"
msgid "%d matches."
msgstr "%d coincidencias."
msgid "Method"
msgstr "Método"
msgid "Signal"
msgstr "Sinal"
msgid "Class"
msgstr "Clase"
msgid "Constant"
msgstr "Constante"
@ -2203,6 +2169,18 @@ msgstr "Propiedade"
msgid "Theme Property"
msgstr "Propiedade de Temas"
msgid "Method"
msgstr "Método"
msgid "Signal"
msgstr "Sinal"
msgid "File"
msgstr "Arquivo"
msgid "%d matches."
msgstr "%d coincidencias."
msgid "Search Help"
msgstr "Buscar na Axuda"
@ -2236,9 +2214,6 @@ msgstr "Só Propiedades de Temas"
msgid "Member Type"
msgstr "Tipo do Membro"
msgid "Class"
msgstr "Clase"
msgid "(%d change)"
msgid_plural "(%d changes)"
msgstr[0] "(% cambio)"
@ -2247,8 +2222,8 @@ msgstr[1] "(% cambios)"
msgid "Resize Array"
msgstr "Redimensionar Array"
msgid "Name:"
msgstr "Nome:"
msgid "Favorites"
msgstr "Favoritos"
msgid "Creating Mesh Previews"
msgstr "Creando Previsualización de Mallas"
@ -2367,21 +2342,9 @@ msgstr ""
msgid "Open Base Scene"
msgstr "Abrir Escena Base"
msgid "Quick Open..."
msgstr "Apertura Rápida..."
msgid "Quick Open Scene..."
msgstr "Apertura Rápida de Escena..."
msgid "Quick Open Script..."
msgstr "Apertura Rápida de Script..."
msgid "Save Scene As..."
msgstr "Gardar Escena Como..."
msgid "Current scene not saved. Open anyway?"
msgstr "Escena actual non gardada ¿Abrir de todos os modos?"
msgid "Can't reload a scene that was never saved."
msgstr "Non se pode volver a cargar unha escena que nunca foi gardada."
@ -2446,34 +2409,6 @@ msgstr "A escena '%s' ten dependencias rotas:"
msgid "Clear Recent Scenes"
msgstr "Limpar Escenas Recentes"
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\"."
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\"."
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\"."
msgid "Default"
msgstr "Por Defecto"
@ -2528,6 +2463,15 @@ msgstr "Abrir Recente"
msgid "Save Scene"
msgstr "Gardar Escena"
msgid "Quick Open..."
msgstr "Apertura Rápida..."
msgid "Quick Open Scene..."
msgstr "Apertura Rápida de Escena..."
msgid "Quick Open Script..."
msgstr "Apertura Rápida de Script..."
msgid "Close Scene"
msgstr "Pechar Escena"
@ -2707,9 +2651,6 @@ msgstr "Facer Único"
msgid "Save As..."
msgstr "Gardar Como..."
msgid "Show in FileSystem"
msgstr "Amosar no Sistema de Arquivos"
msgid "New %s"
msgstr "Novo %s"
@ -2728,6 +2669,9 @@ msgstr ""
msgid "Write your logic in the _run() method."
msgstr "Escribe a túa lóxica no método '_run()'."
msgid "None"
msgstr "Ningún"
msgid "General"
msgstr "Xeral"
@ -2833,9 +2777,6 @@ msgstr "Características"
msgid "Browse"
msgstr "Examinar"
msgid "Favorites"
msgstr "Favoritos"
msgid "View items as a grid of thumbnails."
msgstr "Ver elementos coma unha cuadrícula de miniaturas."
@ -2872,6 +2813,9 @@ msgstr "Duplicando Arquivo:"
msgid "Duplicating folder:"
msgstr "Duplicando Cartafol:"
msgid "Create Folder"
msgstr "Crear Cartafol"
msgid "New Inherited Scene"
msgstr "Nova Escena Herdada"
@ -2893,9 +2837,6 @@ msgstr "Eliminar de Favoritos"
msgid "Reimport"
msgstr "Reimportar"
msgid "Open in File Manager"
msgstr "Abrir no Explorador de Arquivos"
msgid "New Folder..."
msgstr "Novo Cartafol..."
@ -3022,12 +2963,6 @@ msgstr ""
msgid "Select This Folder"
msgstr "Seleccionar Este Cartafol"
msgid "All Recognized"
msgstr "Todos Recoñecidos"
msgid "All Files (*)"
msgstr "Todos os Arquivos (*)"
msgid "Open a File"
msgstr "Abrir un Arquivo"
@ -3046,6 +2981,9 @@ msgstr "Gardar un Arquivo"
msgid "Could not create folder. File with that name already exists."
msgstr "Non se puido crear o cartafol. Xa existe un ficheiro con ese nome."
msgid "Could not create folder."
msgstr "Non se puido crear cartafol."
msgid "Go Back"
msgstr "Retroceder"
@ -3085,12 +3023,12 @@ msgstr "Actualizar Arquivos."
msgid "(Un)favorite current folder."
msgstr "Quitar cartafol actual de favoritos."
msgid "Toggle the visibility of hidden files."
msgstr "Amosar/Ocultar arquivos ocultos."
msgid "Directories & Files:"
msgstr "Directorios e Arquivos:"
msgid "Toggle the visibility of hidden files."
msgstr "Amosar/Ocultar arquivos ocultos."
msgid "Preview:"
msgstr "Vista Previa:"
@ -3106,8 +3044,8 @@ msgstr "Reproduce o proxecto."
msgid "Play the edited scene."
msgstr "Reproduce a escena actual."
msgid "Quick Run Scene..."
msgstr "Execución Rápida de Escena..."
msgid "Network Profiler"
msgstr "Analítica de Rendemento de Rede"
msgid "Play This Scene"
msgstr "Reproducir Esta Escena"
@ -3140,6 +3078,9 @@ msgstr ""
"Mantén pulsado %s para redondear a enteiros. \n"
"Mantén pulsado Shift para cambios máis precisos."
msgid "(unknown)"
msgstr "(descoñecido)"
msgid "Unlock Node"
msgstr "Desbloquear Nodo"
@ -3374,9 +3315,6 @@ msgstr "Futuro"
msgid "Depth"
msgstr "Profundidad"
msgid "Error!"
msgstr "Erro!"
msgid "Move Node"
msgstr "Mover Nodo"
@ -3816,21 +3754,6 @@ msgstr "Editar Característica Adicional (Plugin)"
msgid "Installed Plugins:"
msgstr "Características Adicionais (Plugins) Instalados:"
msgid " - Variation"
msgstr " - Variación"
msgid "Convert to CPUParticles2D"
msgstr "Converter a CPUParticles2D"
msgid "GPUParticles2D"
msgstr "GPUParticles2D"
msgid "Volume"
msgstr "Volume"
msgid "GPUParticles3D"
msgstr "GPUParticles3D"
msgid "UV Unwrap failed, mesh may not be manifold?"
msgstr ""
"Produciuse un erro no desenvoltura UV, é posible que a malla non sexa "
@ -3883,11 +3806,8 @@ msgstr "Cantidade:"
msgid "Populate"
msgstr "Encher"
msgid "Edit Poly"
msgstr "Editar Polígono"
msgid "Edit Poly (Remove Point)"
msgstr "Editar Polígono (Eliminar Punto)"
msgid "Please Confirm..."
msgstr "Por favor, confirma..."
msgid "Orthogonal"
msgstr "Ortogonal"
@ -3922,9 +3842,6 @@ msgstr "Aliñar Transformación con Perspectiva"
msgid "Align Rotation with View"
msgstr "Aliñar Rotación con Perspectiva"
msgid "None"
msgstr "Ningún"
msgid "Rotating %s degrees."
msgstr "Rotando %s graos."
@ -4098,12 +4015,21 @@ msgstr "Anterior (Pre)"
msgid "Post"
msgstr "Posterior (Post)"
msgid "GPUParticles2D"
msgstr "GPUParticles2D"
msgid "Convert to CPUParticles2D"
msgstr "Converter a CPUParticles2D"
msgid "Volume"
msgstr "Volume"
msgid "GPUParticles3D"
msgstr "GPUParticles3D"
msgid "Delete Point"
msgstr "Eliminar Puntos"
msgid "Please Confirm..."
msgstr "Por favor, confirma..."
msgid "Edit a Plugin"
msgstr "Editar unha Característica Adicional (Plugin)"
@ -4125,13 +4051,6 @@ msgstr "Nome do Script:"
msgid "Activate now?"
msgstr "Activar agora?"
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."
msgid "Create UV Map"
msgstr "Crear Mapa UV"
@ -4154,21 +4073,15 @@ msgstr "Eliminar Polígono Personalizado"
msgid "Transform UV Map"
msgstr "Transformar Mapa UV"
msgid "Open Polygon 2D UV editor."
msgstr "Abrir Editor UV de Polígonos 2D."
msgid "Polygon 2D UV Editor"
msgstr "Editor UV de Polígonos 2D"
msgid "UV"
msgstr "UV"
msgid "Points"
msgstr "Puntos"
msgid "Polygons"
msgstr "Polígonos"
msgid "UV"
msgstr "UV"
msgid "Bones"
msgstr "Ósos"
@ -4205,6 +4118,12 @@ msgstr "Amosar Cuadrícula"
msgid "Configure Grid:"
msgstr "Configurar Cuadrícula:"
msgid "Edit Poly"
msgstr "Editar Polígono"
msgid "Edit Poly (Remove Point)"
msgstr "Editar Polígono (Eliminar Punto)"
msgid "Add Resource"
msgstr "Engadir Recurso"
@ -4254,9 +4173,6 @@ msgstr "Atopar Anterior"
msgid "Sort"
msgstr "Ordenar"
msgid "File"
msgstr "Arquivo"
msgid "Open..."
msgstr "Abrir..."
@ -4776,18 +4692,9 @@ msgstr "Erro ao abrir o arquivo comprimido, non está en formato ZIP."
msgid "The following files failed extraction from package:"
msgstr "Os seguintes arquivos non se poideron extraer do paquete:"
msgid "Import & Edit"
msgstr "Importar e Editar"
msgid "Create & Edit"
msgstr "Crear e Editar"
msgid "Install Project:"
msgstr "Instalar Proxecto:"
msgid "Install & Edit"
msgstr "Instalar e Editar"
msgid "Project Name:"
msgstr "Nome do Proxecto:"
@ -4969,12 +4876,6 @@ msgstr "Ruta base inválida."
msgid "Wrong extension chosen."
msgstr "Extensión incorrecta elixida."
msgid "Plane:"
msgstr "Plano:"
msgid "Floor:"
msgstr "Chan:"
msgid "Plot direct lighting"
msgstr "Colocar iluminación directa"
@ -4994,9 +4895,6 @@ msgstr "RPC Entrante"
msgid "Outgoing RPC"
msgstr "RPC Saínte"
msgid "Network Profiler"
msgstr "Analítica de Rendemento de Rede"
msgid "Delete Property?"
msgstr "Eliminar Propiedad?"
@ -5010,9 +4908,6 @@ msgstr ""
"O Keystore Release non está configurado correctamente nos axustes de "
"exportación."
msgid "Signing release %s..."
msgstr "Asinando a versión %s..."
msgid ""
"output: \n"
"%s"
@ -5039,14 +4934,6 @@ msgstr ""
"Engade un nodo CollisionShape2D ou CollisionPolygon2D como fillo para definir "
"a sua forma."
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."
msgid "Node A and Node B must be PhysicsBody2Ds"
msgstr "Os nodo A e B teñen que ser do tipo PhysicsBody2D"

View File

@ -301,6 +301,15 @@ msgstr "פעולה"
msgid "Deadzone"
msgstr "שטח מת"
msgid "Name:"
msgstr "שם:"
msgid "Type:"
msgstr "סוג:"
msgid "Add Metadata Property for \"%s\""
msgstr "הוספת מטא־נתון עבור ”%s“"
msgid "Time:"
msgstr "זמן:"
@ -415,9 +424,6 @@ msgstr "סיבוב:"
msgid "Scale:"
msgstr "קנה מידה:"
msgid "Type:"
msgstr "סוג:"
msgid "(Invalid, expected type: %s)"
msgstr "(לא חוקי, טיפוס מצופה: %s)"
@ -577,9 +583,6 @@ msgstr "הצגת רצועות רק של מפרקים שנבחרו בעץ."
msgid "Group tracks by node or display them as plain list."
msgstr "קיבוץ רצועות לפי מפרק או הצגה כרשימה פשוטה."
msgid "Snap:"
msgstr "הצמדה:"
msgid "Animation step value."
msgstr "ערך צעד של הנפשה."
@ -643,6 +646,12 @@ msgstr "בחירת רצועות להעתקה"
msgid "Select All/None"
msgstr "בחירת הכל/כלום"
msgid "Close"
msgstr "סגירה"
msgid "Error!"
msgstr "שגיאה!"
msgid "Add Audio Track Clip"
msgstr "הוספת קטע רצועת שמע"
@ -755,9 +764,6 @@ msgstr "ניתוק האות אחרי השידור הראשון."
msgid "Cannot connect signal"
msgstr "אין אפשרות לחבר אות"
msgid "Close"
msgstr "סגירה"
msgid "Connect"
msgstr "התחברות"
@ -848,6 +854,9 @@ msgstr "העתקת נתיב המפרק"
msgid "Toggle Visibility"
msgstr "הצגה/הסתרה"
msgid "Clear"
msgstr "ניקוי"
msgid "Scanning for local changes"
msgstr "מחפש שינויים מקומיים"
@ -878,9 +887,6 @@ msgstr "עצירה"
msgid "Start"
msgstr "התחלה"
msgid "Clear"
msgstr "ניקוי"
msgid "Measure:"
msgstr "מדידה:"
@ -1121,15 +1127,6 @@ msgstr "תיקייה עם שם זה כבר קיימת."
msgid "Using slashes in folder names will create subfolders recursively."
msgstr "שימוש בקווים נטויים בשמות תיקיות יצור תת־תיקיות בצורה רקורסיבית."
msgid "Could not create folder."
msgstr "לא ניתן ליצור תיקייה."
msgid "Create new folder in %s:"
msgstr "יצירת תיקייה חדשה ב־%s:"
msgid "Create Folder"
msgstr "יצירת תיקייה"
msgid "Folder name is valid."
msgstr "שם התיקייה תקין."
@ -1139,9 +1136,6 @@ msgstr "לחיצה כפולה לפתיחה בדפדפן."
msgid "Thanks from the Godot community!"
msgstr "תודות מקהילת Godot!"
msgid "(unknown)"
msgstr "(לא ידוע)"
msgid "Godot Engine contributors"
msgstr "מתנדבי מנוע גודו"
@ -1315,12 +1309,6 @@ msgstr "מיקום לפריסה החדשה…"
msgid "Open Audio Bus Layout"
msgstr "פתיחת פריסת אפיקי שמע"
msgid "There is no '%s' file."
msgstr "הקובץ ”%s“ אינו קיים."
msgid "Invalid file, not an audio bus layout."
msgstr "קובץ שגוי, לא פריסה של אפיקי שמע."
msgid "Error saving file: %s"
msgstr "שגיאה בשמירת קובץ: %s"
@ -1590,6 +1578,9 @@ msgstr "ייבוא משאבים (מחדש)"
msgid "Import resources of type: %s"
msgstr "ייבוא משאבים מסוג: %s"
msgid "This method supports a variable number of arguments."
msgstr "שיטה זאת תומכת במספר משתנה של ארגומנטים."
msgid "No return value."
msgstr "אין ערך מוחזר."
@ -1599,9 +1590,6 @@ msgstr "ניסיוני"
msgid "Experimental:"
msgstr "ניסיוני:"
msgid "This method supports a variable number of arguments."
msgstr "שיטה זאת תומכת במספר משתנה של ארגומנטים."
msgid "Constructors"
msgstr "מגדירים"
@ -1762,32 +1750,14 @@ msgstr "עורך"
msgid "No description available."
msgstr "אין תיאור זמין."
msgid "Property:"
msgstr "מאפיין:"
msgid "Show in FileSystem"
msgstr "הצגה בחלון הקבצים"
msgid "Method:"
msgstr "שיטה:"
msgid "Open in File Manager"
msgstr "פתיחה במנהל הקבצים"
msgid "Signal:"
msgstr "אות:"
msgid "Theme Property:"
msgstr "מאפיין ערכת נושא:"
msgid "%d matches."
msgstr "%d התאמות."
msgid "Constructor"
msgstr "בנאי"
msgid "Method"
msgstr "מתודה"
msgid "Operator"
msgstr "אופרטור"
msgid "Signal"
msgstr "אות"
msgid "Class"
msgstr "מחלקה"
msgid "Constant"
msgstr "קבוע"
@ -1798,9 +1768,27 @@ msgstr "מאפיין"
msgid "Theme Property"
msgstr "מאפיין ערכת עיצוב"
msgid "Method"
msgstr "מתודה"
msgid "Signal"
msgstr "אות"
msgid "Annotation"
msgstr "הערת הסבר"
msgid "File"
msgstr "קובץ"
msgid "%d matches."
msgstr "%d התאמות."
msgid "Constructor"
msgstr "בנאי"
msgid "Operator"
msgstr "אופרטור"
msgid "Search Help"
msgstr "חיפוש בעזרה"
@ -1843,15 +1831,9 @@ msgstr "מאפייני ערכת עיצוב בלבד"
msgid "Member Type"
msgstr "סוג שדה"
msgid "(constructors)"
msgstr "(בנאים)"
msgid "Keywords"
msgstr "מילות מפתח"
msgid "Class"
msgstr "מחלקה"
msgid "Pinning a value forces it to be saved even if it's equal to the default."
msgstr "הצמדת ערך מאלצת אותו להישמר גם אם הוא שווה לברירת המחדל."
@ -1901,12 +1883,6 @@ msgstr "הסרת מטא-נתונים %s"
msgid "Unpinned %s"
msgstr "בוטלה ההצמדה של %s"
msgid "Name:"
msgstr "שם:"
msgid "Add Metadata Property for \"%s\""
msgstr "הוספת מטא־נתון עבור ”%s“"
msgid "Copy Value"
msgstr "העתקת ערך"
@ -2046,21 +2022,9 @@ msgstr ""
msgid "Open Base Scene"
msgstr "פתיחת סצנת בסיס"
msgid "Quick Open..."
msgstr "פתיחה מהירה…"
msgid "Quick Open Scene..."
msgstr "פתיחת סצנה מהירה…"
msgid "Quick Open Script..."
msgstr "פתיחת סקריפט מהירה…"
msgid "Save Scene As..."
msgstr "שמירת סצנה בשם…"
msgid "Current scene not saved. Open anyway?"
msgstr "הסצנה הנוכחית לא נשמרה. לפתוח בכל זאת?"
msgid "Can't undo while mouse buttons are pressed."
msgstr "לא יכול לבטל פעולה כשכפתורי העכבר לחוצים."
@ -2144,30 +2108,6 @@ msgstr "לסצנה ”%s“ יש תלות חסרה:"
msgid "Clear Recent Scenes"
msgstr "נקה סצינות אחרונות"
msgid ""
"No main scene has ever been defined, select one?\n"
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
"לא הוגדרה עדיין סצנה ראשית. האם לבחור אחת?\n"
"ניתן לשנות זאת בהמשך ב”הגדרות המיזם“ תחת הקטגוריה ”יישום“."
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 ""
"הסצנה ”%s“ שנבחרה אינה קיימת. האם לבחור סצנה קיימת?\n"
"ניתן לשנות זאת בהמשך ב”הגדרות המיזם“ תחת הקטגוריה ”יישום“."
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 ""
"הסצנה ”%s“ שנבחרה אינה קובץ סצנה. האם לבחור קובץ סצנה?\n"
"ניתן לשנות זאת בהמשך ב”הגדרות המיזם“ תחת הקטגוריה ”יישום“."
msgid "Default"
msgstr "בחירת מחדל"
@ -2222,6 +2162,15 @@ msgstr "פתיחה מהאחרונים"
msgid "Save Scene"
msgstr "שמירת סצנה"
msgid "Quick Open..."
msgstr "פתיחה מהירה…"
msgid "Quick Open Scene..."
msgstr "פתיחת סצנה מהירה…"
msgid "Quick Open Script..."
msgstr "פתיחת סקריפט מהירה…"
msgid "MeshLibrary..."
msgstr "MeshLibrary..."
@ -2327,13 +2276,6 @@ msgstr "ייצוא ספריה"
msgid "Open & Run a Script"
msgstr "פתיחה והרצה של סקריפט"
msgid ""
"The following files are newer on disk.\n"
"What action should be taken?"
msgstr ""
"הקבצים הבאים הם חדשים בכונן.\n"
"באילו פעולות לנקוט?"
msgid "New Inherited"
msgstr "חדש בירושה"
@ -2406,9 +2348,6 @@ msgstr "הפוך לייחודי"
msgid "Save As..."
msgstr "שמירה בשם…"
msgid "Show in FileSystem"
msgstr "הצגה בחלון הקבצים"
msgid "Convert to %s"
msgstr "המרה ל-%s"
@ -2621,6 +2560,9 @@ msgstr "קובץ משוכפל:"
msgid "Duplicating folder:"
msgstr "תיקייה משוכפלת:"
msgid "Create Folder"
msgstr "יצירת תיקייה"
msgid "New Inherited Scene"
msgstr "סצנה חדשה יורשת"
@ -2633,9 +2575,6 @@ msgstr "צפייה בבעלים…"
msgid "Reimport"
msgstr "ייבוא מחדש"
msgid "Open in File Manager"
msgstr "פתיחה במנהל הקבצים"
msgid "New Folder..."
msgstr "תיקייה חדשה…"
@ -2688,12 +2627,6 @@ msgstr "רשת"
msgid "Select Current Folder"
msgstr "נא לבחור את התיקייה הנוכחית"
msgid "All Recognized"
msgstr "כל המוכרים"
msgid "All Files (*)"
msgstr "כל הקבצים (*)"
msgid "Open a File"
msgstr "פתיחת קובץ"
@ -2709,6 +2642,9 @@ msgstr "פתיחת קובץ או תיקייה"
msgid "Save a File"
msgstr "שמירת קובץ"
msgid "Could not create folder."
msgstr "לא ניתן ליצור תיקייה."
msgid "Go Back"
msgstr "מעבר אחורה"
@ -2751,12 +2687,12 @@ msgstr "ריענון קבצים."
msgid "(Un)favorite current folder."
msgstr "(בטל) העדפת תיקייה נוכחית."
msgid "Toggle the visibility of hidden files."
msgstr "הצג/הסתר קבצים מוסתרים."
msgid "Directories & Files:"
msgstr "תיקיות וקבצים:"
msgid "Toggle the visibility of hidden files."
msgstr "הצג/הסתר קבצים מוסתרים."
msgid "Preview:"
msgstr "תצוגה מקדימה:"
@ -2772,8 +2708,8 @@ msgstr "הרצת הסצנה שנערכה."
msgid "Play a custom scene."
msgstr "הרצת סצנה בהתאמה אישית."
msgid "Quick Run Scene..."
msgstr "הפעלה מהירה של הסצנה..."
msgid "Network Profiler"
msgstr "מאפיין רשת"
msgid "Play This Scene"
msgstr "הרצת הסצנה"
@ -2799,6 +2735,9 @@ msgstr "חלון חדש"
msgid "Add a new scene."
msgstr "הוספת סצנה חדשה."
msgid "(unknown)"
msgstr "(לא ידוע)"
msgid "Toggle Visible"
msgstr "הצגה/הסתרה"
@ -3130,18 +3069,6 @@ msgstr "המיזוג הבא השתנה"
msgid "Change Blend Time"
msgstr "שינוי זמן מיזוג"
msgid "Play selected animation backwards from current pos. (A)"
msgstr "ניגון לאחור של ההנפשה שנבחרה מהמיקום הנוכחי. (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "ניגון לאחור של ההנפשה שנבחרה מהסוף. (Shift+A)"
msgid "Play selected animation from start. (Shift+D)"
msgstr "ניגון ההנפשה שנבחרה מההתחלה. (Shift+D)"
msgid "Play selected animation from current pos. (D)"
msgstr "ניגון ההנפשה שנבחרה מהמיקום הנוכחי. (D)"
msgid "Animation position (in seconds)."
msgstr "מיקום הנפשה (בשניות)."
@ -3202,9 +3129,6 @@ msgstr "הכללת גיזמו (3D)"
msgid "Pin AnimationPlayer"
msgstr "הצמדת AnimationPlayer"
msgid "Error!"
msgstr "שגיאה!"
msgid "Cross-Animation Blend Times"
msgstr "זמני מיזוג בין הנפשות"
@ -3520,9 +3444,6 @@ msgstr "שינוי רדיוס תאורה"
msgid "Change Notifier AABB"
msgstr "שינוי מודיע AABB"
msgid "Failed creating lightmap images, make sure path is writable."
msgstr "יצירת תמונות lightmap נכשלה, ודא/י שהנתיב ניתן לכתיבה."
msgid "Bake Lightmaps"
msgstr "אפיית Lightmaps"
@ -3541,11 +3462,8 @@ msgstr "קנה-מידה אקראי:"
msgid "Amount:"
msgstr "כמות:"
msgid "Edit Poly"
msgstr "עריכת מצולע"
msgid "Edit Poly (Remove Point)"
msgstr "עריכת מצולע (הסרת נקודה)"
msgid "Please Confirm..."
msgstr "נא לאשר…"
msgid "Transform Aborted."
msgstr "שינוי צורה הופסק."
@ -3643,9 +3561,6 @@ msgstr "המרה ל־Parallax2D"
msgid "Delete Point"
msgstr "מחיקת נקודה"
msgid "Please Confirm..."
msgstr "נא לאשר…"
msgid "Split Path"
msgstr "פיצול נתיב"
@ -3677,6 +3592,12 @@ msgstr "הפעלת הצמדה"
msgid "Configure Grid:"
msgstr "הגדר רשת:"
msgid "Edit Poly"
msgstr "עריכת מצולע"
msgid "Edit Poly (Remove Point)"
msgstr "עריכת מצולע (הסרת נקודה)"
msgid "ERROR: Couldn't load resource!"
msgstr "שגיאה: לא ניתן לטעון משאב!"
@ -3743,9 +3664,6 @@ msgstr "איתור הקודם"
msgid "Sort"
msgstr "מיון"
msgid "File"
msgstr "קובץ"
msgid "Open..."
msgstr "פתיחה..."
@ -3839,6 +3757,18 @@ msgstr "הסרת כל נקודות העצירה"
msgid "Delete Animation?"
msgstr "מחיקת אנימציה?"
msgid "Play selected animation backwards from current pos. (A)"
msgstr "ניגון לאחור של ההנפשה שנבחרה מהמיקום הנוכחי. (A)"
msgid "Play selected animation backwards from end. (Shift+A)"
msgstr "ניגון לאחור של ההנפשה שנבחרה מהסוף. (Shift+A)"
msgid "Play selected animation from start. (Shift+D)"
msgstr "ניגון ההנפשה שנבחרה מההתחלה. (Shift+D)"
msgid "Play selected animation from current pos. (D)"
msgstr "ניגון ההנפשה שנבחרה מהמיקום הנוכחי. (D)"
msgid "Zoom Reset"
msgstr "איפוס התקריב"
@ -4200,36 +4130,12 @@ msgstr "נתיב בסיס לא חוקי."
msgid "Wrong extension chosen."
msgstr "נבחרה הרחבה לא נכונה."
msgid "Change Cylinder Radius"
msgstr "שינוי רדיוס גליל"
msgid "Change Cylinder Height"
msgstr "שינוי גובה גליל"
msgid "Change Torus Inner Radius"
msgstr "שינוי רדיוס פנימי של טבעת"
msgid "Change Torus Outer Radius"
msgstr "שינוי רדיוס חיצוני של טבעת"
msgid "Next Plane"
msgstr "המישור הבא"
msgid "Previous Plane"
msgstr "המישור הקודם"
msgid "Plane:"
msgstr "מישור:"
msgid "Next Floor"
msgstr "הקומה הבאה"
msgid "Previous Floor"
msgstr "הקומה הקודמת"
msgid "Floor:"
msgstr "קומה:"
msgid "GridMap Delete Selection"
msgstr "GridMap מחיקת הבחירה"
@ -4242,6 +4148,12 @@ msgstr "GridMap הדבקת הבחירה"
msgid "GridMap Paint"
msgstr "GridMap צביעה"
msgid "Previous Floor"
msgstr "הקומה הקודמת"
msgid "Next Floor"
msgstr "הקומה הבאה"
msgid "Edit X Axis"
msgstr "עריכת ציר X"
@ -4251,6 +4163,12 @@ msgstr "עריכת ציר Y"
msgid "Edit Z Axis"
msgstr "עריכת ציר Z"
msgid "GridMap Settings"
msgstr "הגדרות GridMap"
msgid "Pick Distance:"
msgstr "בחירת מרחק:"
msgid "Cursor Rotate X"
msgstr "הטיית מצביע ב־X"
@ -4260,36 +4178,6 @@ msgstr "הטיית מצביע ב־Y"
msgid "Cursor Rotate Z"
msgstr "הטיית מצביע ב־Z"
msgid "Cursor Back Rotate X"
msgstr "הטיית מצביע הפוכה ב־X"
msgid "Cursor Back Rotate Y"
msgstr "הטיית מצביע הפוכה ב־Y"
msgid "Cursor Back Rotate Z"
msgstr "הטיית מצביע הפוכה ב־Z"
msgid "Cursor Clear Rotation"
msgstr "מחיקת הטיית מצביע"
msgid "Paste Selects"
msgstr "הדבקה ובחירה"
msgid "Clear Selection"
msgstr "ניקוי הבחירה"
msgid "Fill Selection"
msgstr "מילוי הבחירה"
msgid "Grid Map"
msgstr "מפת רשת"
msgid "GridMap Settings"
msgstr "הגדרות GridMap"
msgid "Pick Distance:"
msgstr "בחירת מרחק:"
msgid "Give a MeshLibrary resource to this GridMap to use its meshes."
msgstr "יש לחבר משאב MeshLibrary ל- GridMap הזה כדי להשתמש ברשתות שלו."
@ -4311,9 +4199,6 @@ msgstr "RPC יוצא"
msgid "Config"
msgstr "הקונפדרציה"
msgid "Network Profiler"
msgstr "מאפיין רשת"
msgid "A NavigationMesh resource must be set or created for this node to work."
msgstr "יש להגדיר או ליצור משאב NavigationMesh כדי שצומת זה יפעל."
@ -4404,13 +4289,6 @@ msgid ""
"shape resource for it!"
msgstr "יש לספק צורה כדי ש-CollisionShape2D יתפקד. יש ליצור משאב צורה עבורו!"
msgid ""
"Polygon-based shapes are not meant be used nor edited directly through the "
"CollisionShape2D node. Please use the CollisionPolygon2D node instead."
msgstr ""
"צורות מבוססות מצולע אינן מיועדות לשימוש או לעריכה ישירות דרך מפרק "
"CollisionShape2D. במקום זאת יש להשתמש במפרק מסוג CollisionPolygon2D."
msgid "Path property must point to a valid Node2D node to work."
msgstr "מאפיין הנתיב חייב להצביע על מפרק Node2D חוקי כדי לעבוד."

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More