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 ../../.. cd ../../..
ls -l bin/android_editor_builds/ 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 - name: Upload artifact
uses: ./.github/actions/upload-artifact uses: ./.github/actions/upload-artifact
with: with:
name: ${{ matrix.cache-name }} 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 artifact: false
cache-limit: 5 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 cache-name: linux-template-mono
target: template_release target: template_release
sconsflags: module_mono_enabled=yes sconsflags: module_mono_enabled=yes
@ -84,6 +84,16 @@ jobs:
artifact: true artifact: true
cache-limit: 1 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) - name: Minimal template (target=template_release, tests=yes, everything disabled)
cache-name: linux-template-minimal cache-name: linux-template-minimal
target: template_release target: template_release
@ -105,7 +115,7 @@ jobs:
run: | run: |
sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EB8B81E14DA65431D7504EA8F63F0F2B90935439 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 sudo apt-get install -qq mesa-vulkan-drivers
# TODO: Figure out somehow how to embed this one. # TODO: Figure out somehow how to embed this one.

1
.gitignore vendored
View File

@ -363,6 +363,7 @@ cpp.hint
# macOS # macOS
.DS_Store .DS_Store
__MACOSX __MACOSX
Godot.app
# Windows # Windows
# https://github.com/github/gitignore/blob/main/Global/Windows.gitignore # 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 2007-2014, Juan Linietsky, Ariel Manzur
License: Expat and Zlib 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 Files: modules/godot_physics_2d/godot_joints_2d.cpp
Comment: Chipmunk2D Joint Constraints Comment: Chipmunk2D Joint Constraints
Copyright: 2007, Scott Lembcke Copyright: 2007, Scott Lembcke
@ -179,11 +188,6 @@ Comment: Basis Universal
Copyright: 2019-2024, Binomial LLC. Copyright: 2019-2024, Binomial LLC.
License: Apache-2.0 License: Apache-2.0
Files: thirdparty/betsy/*
Comment: Betsy
Copyright: 2020-2022, Matias N. Goldberg
License: Expat
Files: thirdparty/brotli/* Files: thirdparty/brotli/*
Comment: Brotli Comment: Brotli
Copyright: 2009, 2010, 2013-2016 by the Brotli Authors. Copyright: 2009, 2010, 2013-2016 by the Brotli Authors.
@ -407,6 +411,11 @@ Comment: FastLZ
Copyright: 2005-2020, Ariya Hidayat Copyright: 2005-2020, Ariya Hidayat
License: Expat License: Expat
Files: thirdparty/misc/FastNoiseLite.h
Comment: FastNoise Lite
Copyright: 2023, Jordan Peck and contributors
License: Expat
Files: thirdparty/misc/ifaddrs-android.cc Files: thirdparty/misc/ifaddrs-android.cc
thirdparty/misc/ifaddrs-android.h thirdparty/misc/ifaddrs-android.h
Comment: libjingle Comment: libjingle
@ -419,17 +428,17 @@ Comment: Tangent Space Normal Maps implementation
Copyright: 2011, Morten S. Mikkelsen Copyright: 2011, Morten S. Mikkelsen
License: Zlib 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 Files: thirdparty/misc/ok_color.h
thirdparty/misc/ok_color_shader.h thirdparty/misc/ok_color_shader.h
Comment: OK Lab color space Comment: OK Lab color space
Copyright: 2021, Björn Ottosson Copyright: 2021, Björn Ottosson
License: Expat License: Expat
Files: thirdparty/noise/FastNoiseLite.h
Comment: FastNoise Lite
Copyright: 2023, Jordan Peck and contributors
License: Expat
Files: thirdparty/misc/pcg.cpp Files: thirdparty/misc/pcg.cpp
thirdparty/misc/pcg.h thirdparty/misc/pcg.h
Comment: Minimal PCG32 implementation Comment: Minimal PCG32 implementation
@ -480,11 +489,6 @@ Comment: Multi-channel signed distance field generator
Copyright: 2014-2024, Viktor Chlumsky Copyright: 2014-2024, Viktor Chlumsky
License: Expat 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/* Files: thirdparty/openxr/*
Comment: OpenXR Loader Comment: OpenXR Loader
Copyright: 2020-2023, The Khronos Group Inc. Copyright: 2020-2023, The Khronos Group Inc.

View File

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

View File

@ -1196,6 +1196,20 @@ bool ResourceLoader::has_custom_uid_support(const String &p_path) {
return false; 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 ResourceLoader::_path_remap(const String &p_path, bool *r_translation_remapped) {
String new_path = p_path; String new_path = p_path;

View File

@ -246,6 +246,7 @@ public:
static String get_resource_script_class(const String &p_path); static String get_resource_script_class(const String &p_path);
static ResourceUID::ID get_resource_uid(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 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 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 Error rename_dependencies(const String &p_path, const HashMap<String, String> &p_map);
static bool is_import_valid(const String &p_path); 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."); ERR_FAIL_COND_V_MSG(p_id == INVALID_ID, String(), "Invalid UID.");
MutexLock l(mutex); MutexLock l(mutex);
const ResourceUID::Cache *cache = unique_ids.getptr(p_id); 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))); ERR_FAIL_COND_V_MSG(!cache, String(), vformat("Unrecognized UID: \"%s\".", id_to_text(p_id)));
const CharString &cs = cache->cs; const CharString &cs = cache->cs;
return String::utf8(cs.ptr()); return String::utf8(cs.ptr());

View File

@ -37,6 +37,8 @@
class FileAccess; class FileAccess;
typedef void (*ResourceUIDScanForUIDOnStartup)();
class ResourceUID : public Object { class ResourceUID : public Object {
GDCLASS(ResourceUID, Object) GDCLASS(ResourceUID, Object)
public: public:
@ -63,6 +65,8 @@ protected:
static void _bind_methods(); static void _bind_methods();
public: public:
inline static ResourceUIDScanForUIDOnStartup scan_for_uid_on_startup = nullptr;
String id_to_text(ID p_id) const; String id_to_text(ID p_id) const;
ID text_to_id(const String &p_text) 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: { case READING_INT: {
if (is_digit(c)) { if (is_digit(c)) {
if (is_first_char && c == '0') { if (is_first_char && c == '0') {
if (next_char == 'b') { if (next_char == 'b' || next_char == 'B') {
reading = READING_BIN; reading = READING_BIN;
} else if (next_char == 'x') { } else if (next_char == 'x' || next_char == 'X') {
reading = READING_HEX; reading = READING_HEX;
} }
} }
} else if (c == '.') { } else if (c == '.') {
reading = READING_DEC; reading = READING_DEC;
is_float = true; is_float = true;
} else if (c == 'e') { } else if (c == 'e' || c == 'E') {
reading = READING_EXP; reading = READING_EXP;
is_float = true; is_float = true;
} else { } else {
@ -370,7 +370,7 @@ Error Expression::_get_token(Token &r_token) {
case READING_BIN: { case READING_BIN: {
if (bin_beg && !is_binary_digit(c)) { if (bin_beg && !is_binary_digit(c)) {
reading = READING_DONE; reading = READING_DONE;
} else if (c == 'b') { } else if (c == 'b' || c == 'B') {
bin_beg = true; bin_beg = true;
} }
@ -378,14 +378,14 @@ Error Expression::_get_token(Token &r_token) {
case READING_HEX: { case READING_HEX: {
if (hex_beg && !is_hex_digit(c)) { if (hex_beg && !is_hex_digit(c)) {
reading = READING_DONE; reading = READING_DONE;
} else if (c == 'x') { } else if (c == 'x' || c == 'X') {
hex_beg = true; hex_beg = true;
} }
} break; } break;
case READING_DEC: { case READING_DEC: {
if (is_digit(c)) { if (is_digit(c)) {
} else if (c == 'e') { } else if (c == 'e' || c == 'E') {
reading = READING_EXP; reading = READING_EXP;
} else { } else {
reading = READING_DONE; 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) { 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) { 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. // Look for best matching loaded translation.
Ref<Translation> t = main_domain->get_translation_object(locale); Ref<Translation> t = main_domain->get_translation_object(locale);
if (t.is_null()) { if (t.is_null()) {
return "en"; return fallback;
} }
return t->get_locale(); return t->get_locale();
} }

View File

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

View File

@ -1034,6 +1034,18 @@ struct _VariantCall {
return len; 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) { 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 *callable = VariantGetInternalPtr<Callable>::get_ptr(v);
callable->callp(p_args, p_argcount, r_ret, r_error); 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, has, sarray("value"), varray());
bind_method(PackedStringArray, reverse, sarray(), varray()); bind_method(PackedStringArray, reverse, sarray(), varray());
bind_method(PackedStringArray, slice, sarray("begin", "end"), varray(INT_MAX)); 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, sort, sarray(), varray());
bind_method(PackedStringArray, bsearch, sarray("value", "before"), varray(true)); bind_method(PackedStringArray, bsearch, sarray("value", "before"), varray(true));
bind_method(PackedStringArray, duplicate, sarray(), varray()); 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 == '.') { } else if (c == '.') {
reading = READING_DEC; reading = READING_DEC;
is_float = true; is_float = true;
} else if (c == 'e') { } else if (c == 'e' || c == 'E') {
reading = READING_EXP; reading = READING_EXP;
is_float = true; is_float = true;
} else { } else {
@ -451,7 +451,7 @@ Error VariantParser::get_token(Stream *p_stream, Token &r_token, int &line, Stri
} break; } break;
case READING_DEC: { case READING_DEC: {
if (is_digit(c)) { if (is_digit(c)) {
} else if (c == 'e') { } else if (c == 'e' || c == 'E') {
reading = READING_EXP; reading = READING_EXP;
} else { } else {
reading = READING_DONE; reading = READING_DONE;
@ -1224,7 +1224,7 @@ Error VariantParser::parse_value(Token &token, Variant &value, Stream *p_stream,
r_err_str = String(); r_err_str = String();
value_type = Variant::OBJECT; value_type = Variant::OBJECT;
value_class_name = token.value; value_class_name = token.value;
got_comma_token = true; got_bracket_token = true;
} else { } else {
return err; return err;
} }
@ -1962,7 +1962,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
case Variant::FLOAT: { case Variant::FLOAT: {
String s = rtos_fix(p_variant.operator double()); String s = rtos_fix(p_variant.operator double());
if (s != "inf" && s != "inf_neg" && s != "nan") { 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"; 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. 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]. 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. 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> </member>
</members> </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> </class>

View File

@ -109,8 +109,9 @@
<param index="5" name="aligned" type="bool" default="true" /> <param index="5" name="aligned" type="bool" default="true" />
<param index="6" name="antialiased" type="bool" default="false" /> <param index="6" name="antialiased" type="bool" default="false" />
<description> <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]. 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. 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]. [b]Note:[/b] [param antialiased] is only effective if [param width] is greater than [code]0.0[/code].
</description> </description>
@ -146,7 +147,7 @@
<param index="3" name="width" type="float" default="-1.0" /> <param index="3" name="width" type="float" default="-1.0" />
<param index="4" name="antialiased" type="bool" default="false" /> <param index="4" name="antialiased" type="bool" default="false" />
<description> <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]. 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> </description>
</method> </method>
@ -535,7 +536,7 @@
<description> <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]). 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. 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> </description>
</method> </method>
<method name="make_canvas_position_local" qualifiers="const"> <method name="make_canvas_position_local" qualifiers="const">

View File

@ -701,7 +701,7 @@
<method name="is_layout_rtl" qualifiers="const"> <method name="is_layout_rtl" qualifiers="const">
<return type="bool" /> <return type="bool" />
<description> <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> </description>
</method> </method>
<method name="release_focus"> <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. 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>
<member name="layout_direction" type="int" setter="set_layout_direction" getter="get_layout_direction" enum="Control.LayoutDirection" default="0"> <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>
<member name="localize_numeral_system" type="bool" setter="set_localize_numeral_system" getter="is_localizing_numeral_system" default="true"> <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. 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. [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>
<constant name="NOTIFICATION_LAYOUT_DIRECTION_CHANGED" value="49"> <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>
<constant name="CURSOR_ARROW" value="0" enum="CursorShape"> <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]. 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. Automatic layout direction, determined from the parent control layout direction.
</constant> </constant>
<constant name="LAYOUT_DIRECTION_APPLICATION_LOCALE" value="1" enum="LayoutDirection"> <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>
<constant name="LAYOUT_DIRECTION_LTR" value="2" enum="LayoutDirection"> <constant name="LAYOUT_DIRECTION_LTR" value="2" enum="LayoutDirection">
Left-to-right layout direction. Left-to-right layout direction.
@ -1381,7 +1381,7 @@
Right-to-left layout direction. Right-to-left layout direction.
</constant> </constant>
<constant name="LAYOUT_DIRECTION_SYSTEM_LOCALE" value="4" enum="LayoutDirection"> <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>
<constant name="LAYOUT_DIRECTION_MAX" value="5" enum="LayoutDirection"> <constant name="LAYOUT_DIRECTION_MAX" value="5" enum="LayoutDirection">
Represents the size of the [enum LayoutDirection] enum. 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. Port used for file server when exporting project with remote file system.
</member> </member>
<member name="filesystem/import/blender/blender_path" type="String" setter="" getter=""> <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]. 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>
<member name="filesystem/import/blender/rpc_port" type="int" setter="" getter=""> <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. 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]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]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]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. [b]Note:[/b] Only available in the Android editor.
</member> </member>
<member name="run/window_placement/game_embed_mode" type="int" setter="" getter=""> <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. Overrides game embedding setting for all newly opened projects. If enabled, game embedding settings are not saved.
</member> </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=""> <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. 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." [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=""> <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. 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>
<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=""> <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. If [code]true[/code], tool scripts will be automatically soft-reloaded after they are saved.
</member> </member>

View File

@ -16,6 +16,7 @@
<param index="0" name="callable" type="Callable" /> <param index="0" name="callable" type="Callable" />
<description> <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. 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> </description>
</method> </method>
<method name="create_object" qualifiers="vararg"> <method name="create_object" qualifiers="vararg">

View File

@ -117,6 +117,8 @@
<return type="bool" /> <return type="bool" />
<description> <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. 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> </description>
</method> </method>
<method name="look_at"> <method name="look_at">

View File

@ -193,7 +193,7 @@
<method name="to_byte_array" qualifiers="const"> <method name="to_byte_array" qualifiers="const">
<return type="PackedByteArray" /> <return type="PackedByteArray" />
<description> <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> </description>
</method> </method>
</methods> </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. [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>
<member name="audio/driver/mix_rate" type="int" setter="" getter="" default="44100"> <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>
<member name="audio/driver/mix_rate.web" type="int" setter="" getter="" default="0"> <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). 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>
<member name="internationalization/locale/fallback" type="String" setter="" getter="" default="&quot;en&quot;"> <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. 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>
<member name="internationalization/locale/include_text_server_data" type="bool" setter="" getter="" default="false"> <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. 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] "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>
<member name="internationalization/locale/test" type="String" setter="" getter="" default="&quot;&quot;"> <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>
<member name="internationalization/pseudolocalization/double_vowels" type="bool" setter="" getter="" default="false"> <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. Double vowels in strings during pseudolocalization to simulate the lengthening of text due to localization.
@ -1509,7 +1513,7 @@
</member> </member>
<member name="internationalization/rendering/text_driver" type="String" setter="" getter="" default="&quot;&quot;"> <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. 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] 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]. [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> </member>
@ -2328,6 +2332,7 @@
</member> </member>
<member name="physics/3d/run_on_separate_thread" type="bool" setter="" getter="" default="false"> <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. 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>
<member name="physics/3d/sleep_threshold_angular" type="float" setter="" getter="" default="0.139626"> <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]. 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. 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. [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>
<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. 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>
<member name="rendering/lightmapping/bake_performance/max_rays_per_probe_pass" type="int" setter="" getter="" default="64"> <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. 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>
<member name="rendering/lightmapping/bake_performance/max_transparency_rays" type="int" setter="" getter="" default="8"> <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. 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>
<member name="rendering/lightmapping/bake_performance/region_size" type="int" setter="" getter="" default="512"> <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>
<member name="rendering/lightmapping/bake_quality/high_quality_probe_ray_count" type="int" setter="" getter="" default="512"> <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]. 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. [b]Note:[/b] This setting is implemented only on Windows, Android, macOS, iOS, and Linux/X11.
</member> </member>
<member name="rendering/rendering_device/fallback_to_vulkan" type="bool" setter="" getter="" default="true"> <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. 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. [b]Note:[/b] This setting is implemented only on Windows and macOS.
</member> </member>
<member name="rendering/rendering_device/pipeline_cache/enable" type="bool" setter="" getter="" default="true"> <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. 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"> <method name="get_line_column_at_pos" qualifiers="const">
<return type="Vector2i" /> <return type="Vector2i" />
<param index="0" name="position" 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> <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> </description>
</method> </method>
<method name="get_line_count" qualifiers="const"> <method name="get_line_count" qualifiers="const">
@ -416,6 +419,13 @@
Returns the width in pixels of the [param wrap_index] on [param line]. Returns the width in pixels of the [param wrap_index] on [param line].
</description> </description>
</method> </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"> <method name="get_line_wrap_count" qualifiers="const">
<return type="int" /> <return type="int" />
<param index="0" name="line" 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 #endif
#ifdef RENDER_MATERIAL #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.z = 0.00001;
gl_Position.w = 1.0; gl_Position.w = 1.0;
#endif #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 needs_arg_encoders = true;
bool metal_fx_spatial = false; /**< If true, Metal FX spatial functions are supported. */ 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 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 { struct MetalLimits {

View File

@ -99,6 +99,10 @@ void MetalDeviceProperties::init_features(id<MTLDevice> p_device) {
features.supports32BitMSAA = p_device.supports32BitMSAA; 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); features.hostMemoryPageSize = sysconf(_SC_PAGESIZE);
for (SampleCount sc = SampleCount1; sc <= SampleCount64; sc <<= 1) { for (SampleCount sc = SampleCount1; sc <= SampleCount64; sc <<= 1) {

View File

@ -65,7 +65,6 @@
#import <zlib.h> #import <zlib.h>
#import <initializer_list> #import <initializer_list>
#import <optional> #import <optional>
#import <spirv.hpp>
// These types can be used in Vector and other containers that use // These types can be used in Vector and other containers that use
// pointer operations not supported by ARC. // 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; MTLBindingAccess access = MTLBindingAccessReadOnly;
MTLResourceUsage usage = 0; MTLResourceUsage usage = 0;
MTLTextureType textureType = MTLTextureType2D; MTLTextureType textureType = MTLTextureType2D;
spv::ImageFormat imageFormat = spv::ImageFormatUnknown; int imageFormat = 0;
uint32_t arrayLength = 0; uint32_t arrayLength = 0;
bool isMultisampled = false; 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); id<MTLBuffer> obj = rid::get(p_buffer);
return obj.gpuAddress; return obj.gpuAddress;
} else { } else {
#if DEV_ENABLED
WARN_PRINT_ONCE("buffer_get_device_address is not supported on this OS version.");
#endif
return 0; 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, // 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. // 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; id<MTLTexture> obj = nil;
if (needs_buffer) { if (needs_buffer) {
@ -2033,10 +2036,6 @@ Vector<uint8_t> RenderingDeviceDriverMetal::shader_compile_binary_from_spirv(Vec
CompilerMSL::Options msl_options{}; CompilerMSL::Options msl_options{};
msl_options.set_msl_version(version_major, version_minor); 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; bin_data.msl_version = msl_options.msl_version;
#if TARGET_OS_OSX #if TARGET_OS_OSX
msl_options.platform = CompilerMSL::Options::macOS; 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; msl_options.argument_buffers = false;
bin_data.set_uses_argument_buffers(false); bin_data.set_uses_argument_buffers(false);
} }
msl_options.force_active_argument_buffer_resources = true;
msl_options.force_active_argument_buffer_resources = true; // Same as MoltenVK when using argument buffers. // 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; // Same as MoltenVK when using argument buffers. // msl_options.pad_argument_buffer_resources = true;
msl_options.texture_buffer_native = true; // Enable texture buffer support. msl_options.texture_buffer_native = true; // Enable texture buffer support.
msl_options.use_framebuffer_fetch_subpasses = false; msl_options.use_framebuffer_fetch_subpasses = false;
msl_options.pad_fragment_output_components = true; 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: case SUPPORTS_FRAGMENT_SHADER_WITH_ONLY_SIDE_EFFECTS:
return true; return true;
case SUPPORTS_BUFFER_DEVICE_ADDRESS: case SUPPORTS_BUFFER_DEVICE_ADDRESS:
return false; return device_properties->features.supports_gpu_address;
case SUPPORTS_METALFX_SPATIAL: case SUPPORTS_METALFX_SPATIAL:
return device_properties->features.metal_fx_spatial; return device_properties->features.metal_fx_spatial;
case SUPPORTS_METALFX_TEMPORAL: case SUPPORTS_METALFX_TEMPORAL:

View File

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

View File

@ -570,6 +570,7 @@ ActionMapEditor::ActionMapEditor() {
add_edit->set_h_size_flags(Control::SIZE_EXPAND_FILL); add_edit->set_h_size_flags(Control::SIZE_EXPAND_FILL);
add_edit->set_placeholder(TTR("Add New Action")); add_edit->set_placeholder(TTR("Add New Action"));
add_edit->set_clear_button_enabled(true); 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_changed), callable_mp(this, &ActionMapEditor::_add_edit_text_changed));
add_edit->connect(SceneStringName(text_submitted), callable_mp(this, &ActionMapEditor::_add_action)); add_edit->connect(SceneStringName(text_submitted), callable_mp(this, &ActionMapEditor::_add_action));
add_hbox->add_child(add_edit); add_hbox->add_child(add_edit);

View File

@ -145,7 +145,7 @@ void FindReplaceBar::_notification(int p_what) {
} break; } break;
case NOTIFICATION_VISIBILITY_CHANGED: { case NOTIFICATION_VISIBILITY_CHANGED: {
set_process_unhandled_input(is_visible_in_tree()); set_process_input(is_visible_in_tree());
} break; } break;
case NOTIFICATION_THEME_CHANGED: { 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()); ERR_FAIL_COND(p_event.is_null());
Ref<InputEventKey> k = p_event; Ref<InputEventKey> k = p_event;
if (k.is_valid() && k->is_action_pressed(SNAME("ui_cancel"), false, true)) { if (k.is_valid() && k->is_action_pressed(SNAME("ui_cancel"), false, true)) {
Control *focus_owner = get_viewport()->gui_get_focus_owner(); 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) { void FindReplaceBar::_update_flags(bool p_direction_backwards) {
flags = 0; flags = 0;
@ -564,8 +557,8 @@ bool FindReplaceBar::search_next() {
return _search(flags, line, col); return _search(flags, line, col);
} }
void FindReplaceBar::_hide_bar(bool p_force_focus) { void FindReplaceBar::_hide_bar() {
if (replace_text->has_focus() || search_text->has_focus() || p_force_focus) { if (replace_text->has_focus() || search_text->has_focus()) {
text_editor->grab_focus(); text_editor->grab_focus();
} }
@ -789,7 +782,6 @@ FindReplaceBar::FindReplaceBar() {
search_text->set_custom_minimum_size(Size2(100 * EDSCALE, 0)); 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_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(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); matches_label = memnew(Label);
hbc_button_search->add_child(matches_label); hbc_button_search->add_child(matches_label);
@ -828,7 +820,6 @@ FindReplaceBar::FindReplaceBar() {
replace_text->set_tooltip_text(TTR("Replace")); replace_text->set_tooltip_text(TTR("Replace"));
replace_text->set_custom_minimum_size(Size2(100 * EDSCALE, 0)); 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(text_submitted), callable_mp(this, &FindReplaceBar::_replace_text_submitted));
replace_text->connect(SceneStringName(focus_exited), callable_mp(this, &FindReplaceBar::_focus_lost));
replace = memnew(Button); replace = memnew(Button);
hbc_button_replace->add_child(replace); hbc_button_replace->add_child(replace);
@ -850,7 +841,7 @@ FindReplaceBar::FindReplaceBar() {
add_child(hide_button); add_child(hide_button);
hide_button->set_tooltip_text(TTR("Hide")); hide_button->set_tooltip_text(TTR("Hide"));
hide_button->set_focus_mode(FOCUS_NONE); 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); 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 replace_all_mode = false;
bool preserve_cursor = 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 _get_search_from(int &r_line, int &r_col, SearchMode p_search_mode);
void _update_results_count(); void _update_results_count();
void _update_matches_display(); void _update_matches_display();
void _show_search(bool p_with_replace, bool p_show_only); 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 _update_toggle_replace_button(bool p_replace_visible);
void _editor_text_changed(); void _editor_text_changed();
@ -121,8 +123,6 @@ class FindReplaceBar : public HBoxContainer {
protected: protected:
void _notification(int p_what); 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); 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.sec);
time_vals.push_back(oe.msec); time_vals.push_back(oe.msec);
bool e; 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. // Rest of the error data.
bool source_is_project_file = oe.source_file.begins_with("res://"); bool source_is_project_file = oe.source_file.begins_with("res://");

View File

@ -207,6 +207,7 @@ void EditorCommandPalette::open_popup() {
if (was_showed) { if (was_showed) {
popup(prev_rect); popup(prev_rect);
} else { } else {
_update_command_search(String());
popup_centered_clamped(Size2(600, 440) * EDSCALE, 0.8f); 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(); return String();
} }
HashMap<StringName, String>::ConstIterator E = _script_class_icon_paths.find(current); HashMap<StringName, String>::ConstIterator E = _script_class_icon_paths.find(current);
if ((bool)E) { if ((bool)E && !E->value.is_empty()) {
if (r_valid) { if (r_valid) {
*r_valid = true; *r_valid = true;
} }

View File

@ -48,6 +48,9 @@
#include "scene/resources/packed_scene.h" #include "scene/resources/packed_scene.h"
EditorFileSystem *EditorFileSystem::singleton = nullptr; 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 //the name is the version, to keep compatibility with different versions of Godot
#define CACHE_FILE_NAME "filesystem_cache10" #define CACHE_FILE_NAME "filesystem_cache10"
@ -237,16 +240,72 @@ EditorFileSystem::ScannedDirectory::~ScannedDirectory() {
} }
} }
void EditorFileSystem::_first_scan_filesystem() { void EditorFileSystem::_load_first_scan_root_dir() {
EditorProgress ep = EditorProgress("first_scan_filesystem", TTR("Project initialization"), 5);
Ref<DirAccess> d = DirAccess::create(DirAccess::ACCESS_RESOURCES); Ref<DirAccess> d = DirAccess::create(DirAccess::ACCESS_RESOURCES);
first_scan_root_dir = memnew(ScannedDirectory); first_scan_root_dir = memnew(ScannedDirectory);
first_scan_root_dir->full_path = "res://"; 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> existing_class_names;
HashSet<String> extensions; HashSet<String> extensions;
ep.step(TTR("Scanning file structure..."), 0, true); if (!first_scan_root_dir) {
nb_files_total = _scan_new_dir(first_scan_root_dir, d); 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 // Preloading GDExtensions file extensions to prevent looping on all the resource loaders
// for each files in _first_scan_process_scripts. // for each files in _first_scan_process_scripts.
@ -440,6 +499,7 @@ void EditorFileSystem::_scan_filesystem() {
sd = first_scan_root_dir; sd = first_scan_root_dir;
// Will be updated on scan. // Will be updated on scan.
ResourceUID::get_singleton()->clear(); ResourceUID::get_singleton()->clear();
ResourceUID::scan_for_uid_on_startup = nullptr;
processed_files = memnew(HashSet<String>()); processed_files = memnew(HashSet<String>());
} else { } else {
Ref<DirAccess> d = DirAccess::create(DirAccess::ACCESS_RESOURCES); 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. // Create a UID file and new UID, if it's invalid.
Ref<FileAccess> f = FileAccess::open(path + ".uid", FileAccess::WRITE); Ref<FileAccess> f = FileAccess::open(path + ".uid", FileAccess::WRITE);
if (f.is_valid()) { if (f.is_valid()) {
@ -1888,6 +1948,16 @@ EditorFileSystemDirectory *EditorFileSystem::find_file(const String &p_file, int
return fs; 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) { EditorFileSystemDirectory *EditorFileSystem::get_filesystem_path(const String &p_path) {
if (!filesystem || scanning) { if (!filesystem || scanning) {
return nullptr; return nullptr;
@ -2345,7 +2415,7 @@ void EditorFileSystem::update_files(const Vector<String> &p_script_paths) {
ResourceUID::get_singleton()->update_cache(); ResourceUID::get_singleton()->update_cache();
} else { } 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); Ref<FileAccess> f = FileAccess::open(file + ".uid", FileAccess::WRITE);
if (f.is_valid()) { if (f.is_valid()) {
const ResourceUID::ID id = ResourceUID::get_singleton()->create_id(); 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); static void _thread_func(void *_userdata);
EditorFileSystemDirectory *new_filesystem = nullptr; EditorFileSystemDirectory *new_filesystem = nullptr;
ScannedDirectory *first_scan_root_dir = nullptr; static ScannedDirectory *first_scan_root_dir;
bool filesystem_changed_queued = false; bool filesystem_changed_queued = false;
bool scanning = false; bool scanning = false;
@ -192,13 +192,17 @@ class EditorFileSystem : public Node {
float scan_total; float scan_total;
String filesystem_settings_version_for_import; String filesystem_settings_version_for_import;
bool revalidate_import_files = false; bool revalidate_import_files = false;
int nb_files_total = 0; static int nb_files_total;
void _notify_filesystem_changed(); void _notify_filesystem_changed();
void _scan_filesystem(); void _scan_filesystem();
void _first_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); 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; HashSet<String> late_update_files;
void _save_late_updated_files(); void _save_late_updated_files();
@ -255,7 +259,7 @@ class EditorFileSystem : public Node {
HashSet<String> valid_extensions; HashSet<String> valid_extensions;
HashSet<String> import_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); void _process_file_system(const ScannedDirectory *p_scan_dir, EditorFileSystemDirectory *p_dir, ScanProgress &p_progress, HashSet<String> *p_processed_files);
Thread thread_sources; Thread thread_sources;
@ -397,6 +401,7 @@ public:
EditorFileSystemDirectory *get_filesystem_path(const String &p_path); EditorFileSystemDirectory *get_filesystem_path(const String &p_path);
String get_file_type(const String &p_file) const; String get_file_type(const String &p_file) const;
EditorFileSystemDirectory *find_file(const String &p_file, int *r_index) 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); 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); 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 bool _should_skip_directory(const String &p_path);
static void scan_for_uid();
void add_import_format_support_query(Ref<EditorFileSystemImportFormatSupportQuery> p_query); void add_import_format_support_query(Ref<EditorFileSystemImportFormatSupportQuery> p_query);
void remove_import_format_support_query(Ref<EditorFileSystemImportFormatSupportQuery> p_query); void remove_import_format_support_query(Ref<EditorFileSystemImportFormatSupportQuery> p_query);
EditorFileSystem(); EditorFileSystem();

View File

@ -4581,6 +4581,7 @@ EditorHelpHighlighter::~EditorHelpHighlighter() {
FindBar::FindBar() { FindBar::FindBar() {
search_text = memnew(LineEdit); search_text = memnew(LineEdit);
add_child(search_text); 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_custom_minimum_size(Size2(100 * EDSCALE, 0));
search_text->set_h_size_flags(SIZE_EXPAND_FILL); search_text->set_h_size_flags(SIZE_EXPAND_FILL);
search_text->connect(SceneStringName(text_changed), callable_mp(this, &FindBar::_search_text_changed)); search_text->connect(SceneStringName(text_changed), callable_mp(this, &FindBar::_search_text_changed));
@ -4644,7 +4645,7 @@ void FindBar::_notification(int p_what) {
} break; } break;
case NOTIFICATION_VISIBILITY_CHANGED: { case NOTIFICATION_VISIBILITY_CHANGED: {
set_process_unhandled_input(is_visible_in_tree()); set_process_input(is_visible_in_tree());
} break; } break;
} }
} }
@ -4721,12 +4722,15 @@ void FindBar::_hide_bar() {
hide(); 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()); ERR_FAIL_COND(p_event.is_null());
Ref<InputEventKey> k = p_event; Ref<InputEventKey> k = p_event;
if (k.is_valid() && k->is_action_pressed(SNAME("ui_cancel"), false, true)) { 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(); _hide_bar();
accept_event(); accept_event();
} }

View File

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

View File

@ -228,6 +228,11 @@ EditorPlugin *EditorMainScreen::get_selected_plugin() const {
return selected_plugin; 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 { VBoxContainer *EditorMainScreen::get_control() const {
return main_screen_vbox; return main_screen_vbox;
} }
@ -254,6 +259,7 @@ void EditorMainScreen::add_main_plugin(EditorPlugin *p_editor) {
buttons.push_back(tb); buttons.push_back(tb);
button_hb->add_child(tb); button_hb->add_child(tb);
editor_table.push_back(p_editor); 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) { 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); editor_table.erase(p_editor);
main_editor_plugins.erase(p_editor->get_plugin_name());
} }
EditorMainScreen::EditorMainScreen() { EditorMainScreen::EditorMainScreen() {

View File

@ -58,6 +58,7 @@ private:
HBoxContainer *button_hb = nullptr; HBoxContainer *button_hb = nullptr;
Vector<Button *> buttons; Vector<Button *> buttons;
Vector<EditorPlugin *> editor_table; Vector<EditorPlugin *> editor_table;
HashMap<String, EditorPlugin *> main_editor_plugins;
int _get_current_main_editor() const; int _get_current_main_editor() const;
@ -80,6 +81,7 @@ public:
int get_selected_index() const; int get_selected_index() const;
int get_plugin_index(EditorPlugin *p_editor) const; int get_plugin_index(EditorPlugin *p_editor) const;
EditorPlugin *get_selected_plugin() const; EditorPlugin *get_selected_plugin() const;
EditorPlugin *get_plugin_by_name(const String &p_plugin_name) const;
VBoxContainer *get_control() 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. // Only try to load the script if it has a name. Else, the plugin has no init script.
if (script_path.length() > 0) { if (script_path.length() > 0) {
script_path = addon_path.get_base_dir().path_join(script_path); 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()) { if (scr.is_null()) {
show_warning(vformat(TTR("Unable to load addon script from path: '%s'."), script_path)); 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; String script_path;
if (ScriptServer::is_global_class(p_class)) { if (ScriptServer::is_global_class(p_class)) {
script_path = ScriptServer::get_global_class_path(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; script_path = p_class;
} }
@ -5734,7 +5736,9 @@ void EditorNode::_cancel_close_scene_tab() {
} }
void EditorNode::_prepare_save_confirmation_popup() { 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() { 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_greater(true);
spin[i]->set_allow_lesser(true); spin[i]->set_allow_lesser(true);
spin[i]->set_suffix(p_suffix); 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: { case Variant::VECTOR2I: {
EditorPropertyVector2i *editor = memnew(EditorPropertyVector2i(p_wide)); EditorPropertyVector2i *editor = memnew(EditorPropertyVector2i(p_wide));
EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1, true); 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; return editor;
} break; } break;
@ -3690,7 +3691,7 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_
case Variant::VECTOR3I: { case Variant::VECTOR3I: {
EditorPropertyVector3i *editor = memnew(EditorPropertyVector3i(p_wide)); EditorPropertyVector3i *editor = memnew(EditorPropertyVector3i(p_wide));
EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1, true); 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; return editor;
} break; } break;
@ -3704,7 +3705,7 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_
case Variant::VECTOR4I: { case Variant::VECTOR4I: {
EditorPropertyVector4i *editor = memnew(EditorPropertyVector4i); EditorPropertyVector4i *editor = memnew(EditorPropertyVector4i);
EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1, true); 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; return editor;
} break; } break;

View File

@ -447,6 +447,7 @@ void EditorPropertyArray::update_property() {
size_slider = memnew(EditorSpinSlider); size_slider = memnew(EditorSpinSlider);
size_slider->set_step(1); size_slider->set_step(1);
size_slider->set_max(INT32_MAX); size_slider->set_max(INT32_MAX);
size_slider->set_editing_integer(true);
size_slider->set_h_size_flags(SIZE_EXPAND_FILL); size_slider->set_h_size_flags(SIZE_EXPAND_FILL);
size_slider->set_read_only(is_read_only()); size_slider->set_read_only(is_read_only());
size_slider->connect(SceneStringName(value_changed), callable_mp(this, &EditorPropertyArray::_length_changed)); 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; radians_as_degrees = p_radians_as_degrees;
for (EditorSpinSlider *spin : spin_sliders) { 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_greater(true);
spin->set_allow_lesser(true); spin->set_allow_lesser(true);
spin->set_suffix(p_suffix); spin->set_suffix(p_suffix);
spin->set_editing_integer(p_is_int);
} }
if (!p_link) { if (!p_link) {

View File

@ -62,7 +62,7 @@ protected:
public: public:
virtual void update_property() override; 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); 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/auto_reload_and_parse_scripts_on_save", true);
_initial_set("text_editor/behavior/files/open_dominant_script_on_scene_change", false, 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 // Script list
_initial_set("text_editor/script_list/show_members_overview", true, true); _initial_set("text_editor/script_list/show_members_overview", true, true);
_initial_set("text_editor/script_list/sort_members_outline_alphabetically", false, 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()); _initial_set("run/window_placement/rect_custom_position", Vector2());
EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "run/window_placement/screen", -5, screen_hints) EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "run/window_placement/screen", -5, screen_hints)
#endif #endif
// Should match the ANDROID_WINDOW_* constants in 'platform/android/java/editor/src/main/java/org/godotengine/editor/GodotEditor.kt' // 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,Launch in PiP mode:3"; 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/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"); String game_embed_mode_hints = "Disabled:-1,Use Per-Project Configuration:0,Embed Game:1,Make Game Workspace Floating:2";
int default_play_window_pip_mode = 0;
#ifdef ANDROID_ENABLED #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 #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 // Auto save
_initial_set("run/auto_save/save_before_running", true, true); _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); String file_path = selected->get_metadata(0);
TreeItem *parent = selected->get_parent(); TreeItem *parent = selected->get_parent();
bool is_favorite = parent != nullptr && parent->get_metadata(0) == "Favorites"; 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(); bool collapsed = selected->is_collapsed();
selected->set_collapsed(!collapsed); selected->set_collapsed(!collapsed);
} else { } 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; 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(); TreeItem *selected = tree->get_root();
selected = tree->get_next_selected(selected); selected = tree->get_next_selected(selected);
while (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_strings.push_back(selected->get_metadata(0));
} }
selected = tree->get_next_selected(selected); selected = tree->get_next_selected(selected);

View File

@ -220,14 +220,15 @@ QuickOpenResultContainer::QuickOpenResultContainer() {
list = memnew(VBoxContainer); list = memnew(VBoxContainer);
list->set_h_size_flags(Control::SIZE_EXPAND_FILL); list->set_h_size_flags(Control::SIZE_EXPAND_FILL);
list->add_theme_constant_override(SNAME("separation"), 0);
list->hide(); list->hide();
scroll_container->add_child(list); scroll_container->add_child(list);
grid = memnew(HFlowContainer); grid = memnew(HFlowContainer);
grid->set_h_size_flags(Control::SIZE_EXPAND_FILL); grid->set_h_size_flags(Control::SIZE_EXPAND_FILL);
grid->set_v_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(SNAME("v_separation"), 0);
grid->add_theme_constant_override("h_separation", 4); grid->add_theme_constant_override(SNAME("h_separation"), 0);
grid->hide(); grid->hide();
scroll_container->add_child(grid); scroll_container->add_child(grid);
@ -354,12 +355,17 @@ void QuickOpenResultContainer::init(const Vector<StringName> &p_base_types) {
QuickOpenResultCandidate *candidates_write = loaded_candidates.ptrw(); QuickOpenResultCandidate *candidates_write = loaded_candidates.ptrw();
int i = 0; int i = 0;
for (const String &path : paths) { for (const String &path : paths) {
if (!ResourceLoader::exists(path)) {
continue;
}
filetypes.insert(path, type_name); filetypes.insert(path, type_name);
QuickOpenResultCandidate candidate; QuickOpenResultCandidate candidate;
_setup_candidate(candidate, path); _setup_candidate(candidate, path);
candidates_write[i] = candidate; candidates_write[i] = candidate;
i++; i++;
} }
loaded_candidates.resize(i);
selected_history.insert(type, loaded_candidates); 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) { 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; p_candidate.result = nullptr;
StringName actual_type; StringName actual_type;
@ -716,7 +727,7 @@ bool QuickOpenResultContainer::has_nothing_selected() const {
String QuickOpenResultContainer::get_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."); 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) { QuickOpenDisplayMode QuickOpenResultContainer::get_adaptive_display_mode(const Vector<StringName> &p_base_types) {
@ -899,7 +910,7 @@ void QuickOpenResultItem::_notification(int p_what) {
} break; } break;
case NOTIFICATION_THEME_CHANGED: { case NOTIFICATION_THEME_CHANGED: {
selected_stylebox = get_theme_stylebox("selected", "Tree"); 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)); highlighted_font_color = get_theme_color("font_focus_color", EditorStringName(Editor));
} break; } break;
case NOTIFICATION_DRAW: { case NOTIFICATION_DRAW: {
@ -932,49 +943,47 @@ static Vector2i _get_name_interval(const Vector2i &p_interval, int p_dir_index)
QuickOpenResultListItem::QuickOpenResultListItem() { QuickOpenResultListItem::QuickOpenResultListItem() {
set_h_size_flags(Control::SIZE_EXPAND_FILL); 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);
{ hbc = memnew(HBoxContainer);
image_container = memnew(MarginContainer); hbc->add_theme_constant_override(SNAME("separation"), 4 * EDSCALE);
image_container->add_theme_constant_override("margin_top", 2 * EDSCALE); add_child(hbc);
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);
thumbnail = memnew(TextureRect); const int max_size = 36 * EDSCALE;
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);
}
{ thumbnail = memnew(TextureRect);
text_container = memnew(VBoxContainer); thumbnail->set_h_size_flags(Control::SIZE_SHRINK_CENTER);
text_container->add_theme_constant_override("separation", -6 * EDSCALE); thumbnail->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
text_container->set_h_size_flags(Control::SIZE_EXPAND_FILL); thumbnail->set_expand_mode(TextureRect::EXPAND_IGNORE_SIZE);
text_container->set_v_size_flags(Control::SIZE_FILL); thumbnail->set_stretch_mode(TextureRect::STRETCH_KEEP_ASPECT_CENTERED);
add_child(text_container); thumbnail->set_custom_minimum_size(Size2i(max_size, max_size));
hbc->add_child(thumbnail);
name = memnew(HighlightedLabel); text_container = memnew(VBoxContainer);
name->set_h_size_flags(Control::SIZE_EXPAND_FILL); text_container->add_theme_constant_override(SNAME("separation"), -7 * EDSCALE);
name->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS); text_container->set_h_size_flags(Control::SIZE_EXPAND_FILL);
name->set_horizontal_alignment(HorizontalAlignment::HORIZONTAL_ALIGNMENT_LEFT); text_container->set_v_size_flags(Control::SIZE_FILL);
text_container->add_child(name); hbc->add_child(text_container);
path = memnew(HighlightedLabel); name = memnew(HighlightedLabel);
path->set_h_size_flags(Control::SIZE_EXPAND_FILL); name->set_h_size_flags(Control::SIZE_EXPAND_FILL);
path->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS); name->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS);
path->add_theme_font_size_override(SceneStringName(font_size), 12 * EDSCALE); name->set_horizontal_alignment(HorizontalAlignment::HORIZONTAL_ALIGNMENT_LEFT);
text_container->add_child(path); 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) { void QuickOpenResultListItem::set_content(const QuickOpenResultCandidate &p_candidate, bool p_highlight) {
thumbnail->set_texture(p_candidate.thumbnail); thumbnail->set_texture(p_candidate.thumbnail);
name->set_text(p_candidate.file_path.get_file()); const String file_path = ResourceUID::ensure_path(p_candidate.file_path);
path->set_text(p_candidate.file_path.get_base_dir()); name->set_text(file_path.get_file());
path->set_text(file_path.get_base_dir());
name->reset_highlights(); name->reset_highlights();
path->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() { void QuickOpenResultListItem::reset() {
@ -1030,28 +1024,38 @@ void QuickOpenResultListItem::_notification(int p_what) {
//--------------- Grid Item //--------------- Grid Item
QuickOpenResultGridItem::QuickOpenResultGridItem() { QuickOpenResultGridItem::QuickOpenResultGridItem() {
set_h_size_flags(Control::SIZE_FILL); set_custom_minimum_size(Size2i(120 * EDSCALE, 0));
set_v_size_flags(Control::SIZE_EXPAND_FILL); add_theme_constant_override("margin_top", 6 * EDSCALE);
add_theme_constant_override("separation", -2 * 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 = memnew(TextureRect);
thumbnail->set_h_size_flags(Control::SIZE_SHRINK_CENTER); thumbnail->set_h_size_flags(Control::SIZE_SHRINK_CENTER);
thumbnail->set_v_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)); thumbnail->set_custom_minimum_size(Size2i(max_size, max_size));
add_child(thumbnail); vbc->add_child(thumbnail);
name = memnew(HighlightedLabel); name = memnew(HighlightedLabel);
name->set_h_size_flags(Control::SIZE_EXPAND_FILL); name->set_h_size_flags(Control::SIZE_EXPAND_FILL);
name->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS); name->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS);
name->set_horizontal_alignment(HorizontalAlignment::HORIZONTAL_ALIGNMENT_CENTER); name->set_horizontal_alignment(HorizontalAlignment::HORIZONTAL_ALIGNMENT_CENTER);
name->add_theme_font_size_override(SceneStringName(font_size), 13 * EDSCALE); 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) { void QuickOpenResultGridItem::set_content(const QuickOpenResultCandidate &p_candidate, bool p_highlight) {
thumbnail->set_texture(p_candidate.thumbnail); thumbnail->set_texture(p_candidate.thumbnail);
name->set_text(p_candidate.file_path.get_file()); const String file_path = ResourceUID::ensure_path(p_candidate.file_path);
name->set_tooltip_text(p_candidate.file_path); name->set_text(file_path.get_file());
name->set_tooltip_text(file_path);
name->reset_highlights(); name->reset_highlights();
if (p_highlight && p_candidate.result != nullptr) { if (p_highlight && p_candidate.result != nullptr) {

View File

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

View File

@ -1170,6 +1170,9 @@ void SceneTreeEditor::_compute_hash(Node *p_node, uint64_t &hash) {
} }
void SceneTreeEditor::_reset() { void SceneTreeEditor::_reset() {
// Stop any waiting change to tooltip.
update_node_tooltip_delay->stop();
tree->clear(); tree->clear();
node_cache.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_metadata", 0, p_node->get_path());
undo_redo->add_undo_method(item, "set_text", 0, p_node->get_name()); 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(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_metadata", 0, p_node->get_path());
undo_redo->add_do_method(item, "set_text", 0, new_name); 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_text(TTR("Scene"));
current_scene_checkbox->set_h_size_flags(SIZE_EXPAND_FILL); current_scene_checkbox->set_h_size_flags(SIZE_EXPAND_FILL);
current_scene_checkbox->set_clip_text(true); 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)); current_scene_checkbox->connect(SceneStringName(toggled), callable_mp(this, &HistoryDock::refresh_history).unbind(1));
global_history_checkbox = memnew(CheckBox); global_history_checkbox = memnew(CheckBox);
@ -261,6 +262,7 @@ HistoryDock::HistoryDock() {
global_history_checkbox->set_text(TTR("Global")); global_history_checkbox->set_text(TTR("Global"));
global_history_checkbox->set_h_size_flags(SIZE_EXPAND_FILL); global_history_checkbox->set_h_size_flags(SIZE_EXPAND_FILL);
global_history_checkbox->set_clip_text(true); 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)); global_history_checkbox->connect(SceneStringName(toggled), callable_mp(this, &HistoryDock::refresh_history).unbind(1));
action_list = memnew(ItemList); 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 (font_preview.is_valid()) {
if (p_edited_property == "antialiasing") { if (p_edited_property == "antialiasing") {
font_preview->set_antialiasing((TextServer::FontAntialiasing)import_settings_data->get("antialiasing").operator int()); font_preview->set_antialiasing((TextServer::FontAntialiasing)import_settings_data->get("antialiasing").operator int());
_variations_validate();
} else if (p_edited_property == "generate_mipmaps") { } else if (p_edited_property == "generate_mipmaps") {
font_preview->set_generate_mipmaps(import_settings_data->get("generate_mipmaps")); font_preview->set_generate_mipmaps(import_settings_data->get("generate_mipmaps"));
} else if (p_edited_property == "disable_embedded_bitmaps") { } 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") { } else if (p_edited_property == "hinting") {
font_preview->set_hinting((TextServer::Hinting)import_settings_data->get("hinting").operator int()); font_preview->set_hinting((TextServer::Hinting)import_settings_data->get("hinting").operator int());
} else if (p_edited_property == "subpixel_positioning") { } 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") { } else if (p_edited_property == "keep_rounding_remainders") {
font_preview->set_keep_rounding_remainders(import_settings_data->get("keep_rounding_remainders")); font_preview->set_keep_rounding_remainders(import_settings_data->get("keep_rounding_remainders"));
} else if (p_edited_property == "oversampling") { } 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) { 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)."); 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)."); 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()) { if (warn.is_empty()) {
@ -1087,6 +1105,34 @@ void DynamicFontImportSettingsDialog::open_settings(const String &p_path) {
font_preview.instantiate(); font_preview.instantiate();
font_preview->set_data(font_data); 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 font_name = vformat("%s (%s)", font_preview->get_font_name(), font_preview->get_font_style_name());
String sample; String sample;
static const String sample_base = U"12漢字ԱբΑαАбΑαאבابܐܒހށआআਆઆଆஆఆಆആආกิກິༀကႠა한글ᎣᐁᚁᚠᜀᜠᝀᝠកᠠᤁᥐAb😀"; 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_allow_system_fallback(import_settings_data->get("allow_system_fallback"));
font_preview->set_force_autohinter(import_settings_data->get("force_autohinter")); 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_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_keep_rounding_remainders(import_settings_data->get("keep_rounding_remainders"));
font_preview->set_oversampling(import_settings_data->get("oversampling")); 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, "allow_system_fallback"), true));
options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::BOOL, "force_autohinter"), false)); 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, "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::BOOL, "keep_rounding_remainders"), true));
options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::FLOAT, "oversampling", PROPERTY_HINT_RANGE, "0,10,0.1"), 0.0)); 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_variations;
List<ResourceImporter::ImportOption> options_general; List<ResourceImporter::ImportOption> options_general;
bool is_pixel = false;
// Root layout // Root layout
Label *label_warn = nullptr; Label *label_warn = nullptr;
TabContainer *main_pages = 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); font->set_fallbacks(fallbacks);
if (subpixel_positioning == 4 /* Auto (Except Pixel Fonts) */) { if (subpixel_positioning == 4 /* Auto (Except Pixel Fonts) */) {
PackedInt32Array glyphs = TS->font_get_supported_glyphs(font->get_rids()[0]); Array rids = font->get_rids();
bool is_pixel = true; if (!rids.is_empty()) {
for (int32_t gl : glyphs) { PackedInt32Array glyphs = TS->font_get_supported_glyphs(rids[0]);
Dictionary ct = TS->font_get_glyph_contours(font->get_rids()[0], 16, gl); bool is_pixel = true;
PackedInt32Array contours = ct["contours"]; for (int32_t gl : glyphs) {
PackedVector3Array points = ct["points"]; Dictionary ct = TS->font_get_glyph_contours(rids[0], 16, gl);
int prev_start = 0; PackedInt32Array contours = ct["contours"];
for (int i = 0; i < contours.size(); i++) { PackedVector3Array points = ct["points"];
for (int j = prev_start; j <= contours[i]; j++) { int prev_start = 0;
int next_point = (j < contours[i]) ? (j + 1) : prev_start; for (int i = 0; i < contours.size(); i++) {
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))) { for (int j = prev_start; j <= contours[i]; j++) {
is_pixel = false; 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; break;
} }
} }
prev_start = contours[i] + 1;
if (!is_pixel) { if (!is_pixel) {
break; break;
} }
} }
if (!is_pixel) { if (is_pixel && !glyphs.is_empty()) {
break; 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_subpixel_positioning((TextServer::SubpixelPositioning)subpixel_positioning);
font->set_keep_rounding_remainders(keep_rounding_remainders); 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 "+". c++; // Skip "+".
continue; 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. // Read hexadecimal value, start.
token = String(); token = String();
if (step == STEP_START_BEGIN) { 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_separator();
file_popup->add_item(TTR("Open in Inspector"), FILE_MENU_EDIT_LIBRARY); file_popup->add_item(TTR("Open in Inspector"), FILE_MENU_EDIT_LIBRARY);
Rect2 pos = tree->get_item_rect(p_item, 1, 0); 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_popup->popup(Rect2(popup_pos, Size2()));
file_dialog_animation = StringName(); 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_separator();
file_popup->add_item(TTR("Open in Inspector"), FILE_MENU_EDIT_ANIMATION); file_popup->add_item(TTR("Open in Inspector"), FILE_MENU_EDIT_ANIMATION);
Rect2 pos = tree->get_item_rect(p_item, 1, 0); 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_popup->popup(Rect2(popup_pos, Size2()));
file_dialog_animation = anim_name; 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() { 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. // When tree is empty, singleton not in the main thread.
return Vector<String>(); return Vector<String>();
} }

View File

@ -623,7 +623,7 @@ void CanvasItemEditor::_find_canvas_items_at_pos(const Point2 &p_pos, Node *p_no
return; return;
} }
xform = vp->get_popup_base_transform(); 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; return;
} }
} }
@ -726,7 +726,7 @@ void CanvasItemEditor::_find_canvas_items_in_rect(const Rect2 &p_rect, Node *p_n
return; return;
} }
xform = vp->get_popup_base_transform(); 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; return;
} }
} }
@ -3659,10 +3659,12 @@ void CanvasItemEditor::_draw_selection() {
} }
// Remove non-movable nodes. // Remove non-movable nodes.
for (CanvasItem *ci : selection) { for (List<CanvasItem *>::Element *E = selection.front(); E;) {
if (!_is_node_movable(ci)) { List<CanvasItem *>::Element *N = E->next();
selection.erase(ci); if (!_is_node_movable(E->get())) {
selection.erase(E);
} }
E = N;
} }
if (!selection.is_empty() && transform_tool && show_transformation_gizmos) { 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: { case NOTIFICATION_ENTER_TREE: {
window = get_window(); window = get_window();
} break; } break;
case NOTIFICATION_PROCESS: {
if (updated_embedded_process_queued) {
updated_embedded_process_queued = false;
_update_embedded_process();
}
} break;
case NOTIFICATION_DRAW: { case NOTIFICATION_DRAW: {
_draw(); _draw();
} break; } break;
@ -179,6 +185,7 @@ void EmbeddedProcess::embed_process(OS::ProcessID p_pid) {
start_embedding_time = OS::get_singleton()->get_ticks_msec(); start_embedding_time = OS::get_singleton()->get_ticks_msec();
embedding_grab_focus = has_focus(); embedding_grab_focus = has_focus();
timer_update_embedded_process->start(); timer_update_embedded_process->start();
set_process(true);
set_notify_transform(true); set_notify_transform(true);
// Attempt to embed the process, but if it has just started and the window is not ready yet, // 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; embedding_grab_focus = false;
timer_embedding->stop(); timer_embedding->stop();
timer_update_embedded_process->stop(); timer_update_embedded_process->stop();
set_process(false);
set_notify_transform(false); set_notify_transform(false);
queue_redraw(); 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() { void EmbeddedProcess::_try_embed_process() {
bool is_visible = is_visible_in_tree(); 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); 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(); queue_update_embedded_process();
} }
} }
if (updated_embedded_process_queued) {
updated_embedded_process_queued = false;
_update_embedded_process();
}
} }
void EmbeddedProcess::_update_embedded_process() { void EmbeddedProcess::_update_embedded_process() {

View File

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

View File

@ -614,6 +614,10 @@ void GameView::_notification(int p_what) {
// Embedding available. // Embedding available.
int game_mode = EDITOR_GET("run/window_placement/game_embed_mode"); int game_mode = EDITOR_GET("run/window_placement/game_embed_mode");
switch (game_mode) { switch (game_mode) {
case -1: { // Disabled.
embed_on_play = false;
make_floating_on_play = false;
} break;
case 1: { // Embed. case 1: { // Embed.
embed_on_play = true; embed_on_play = true;
make_floating_on_play = false; make_floating_on_play = false;
@ -622,10 +626,6 @@ void GameView::_notification(int p_what) {
embed_on_play = true; embed_on_play = true;
make_floating_on_play = true; make_floating_on_play = true;
} break; } break;
case 3: { // Disabled.
embed_on_play = false;
make_floating_on_play = false;
} break;
default: { default: {
embed_on_play = EditorSettings::get_singleton()->get_project_metadata("game_view", "embed_on_play", true); 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); 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 // 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. // 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())) { 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. // 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 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()) { 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 // Call deferred to prevent the _stop_pressed callback to be executed before the wrapper window
// actually closes. // actually closes.
callable_mp(EditorRunBar::get_singleton(), &EditorRunBar::stop_playing).call_deferred(); 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) { void GameViewPlugin::make_visible(bool p_visible) {
if (p_visible) { if (p_visible) {
window_wrapper->show(); 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) { void GameViewPlugin::set_window_layout(Ref<ConfigFile> p_layout) {
game_view->set_window_layout(p_layout); game_view->set_window_layout(p_layout);
} }
@ -1057,6 +1063,11 @@ Dictionary GameViewPlugin::get_state() const {
return game_view->get_state(); return game_view->get_state();
} }
void GameViewPlugin::_window_visibility_changed(bool p_visible) {
_focus_another_editor();
}
#endif
void GameViewPlugin::_notification(int p_what) { void GameViewPlugin::_notification(int p_what) {
switch (p_what) { switch (p_what) {
case NOTIFICATION_ENTER_TREE: { case NOTIFICATION_ENTER_TREE: {
@ -1081,13 +1092,11 @@ void GameViewPlugin::_feature_profile_changed() {
debugger->set_is_feature_enabled(is_feature_enabled); debugger->set_is_feature_enabled(is_feature_enabled);
} }
#ifndef ANDROID_ENABLED
if (game_view) { if (game_view) {
game_view->set_is_feature_enabled(is_feature_enabled); game_view->set_is_feature_enabled(is_feature_enabled);
} }
} #endif
void GameViewPlugin::_window_visibility_changed(bool p_visible) {
_focus_another_editor();
} }
void GameViewPlugin::_save_last_editor(const String &p_editor) { 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() { void GameViewPlugin::_focus_another_editor() {
if (window_wrapper->get_window_enabled()) { if (_is_window_wrapper_enabled()) {
if (last_editor.is_empty()) { if (last_editor.is_empty()) {
EditorNode::get_singleton()->get_editor_main_screen()->select(EditorMainScreen::EDITOR_2D); EditorNode::get_singleton()->get_editor_main_screen()->select(EditorMainScreen::EDITOR_2D);
} else { } 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() { GameViewPlugin::GameViewPlugin() {
debugger.instantiate();
#ifndef ANDROID_ENABLED
window_wrapper = memnew(WindowWrapper); window_wrapper = memnew(WindowWrapper);
window_wrapper->set_window_title(vformat(TTR("%s - Godot Engine"), TTR("Game Workspace"))); window_wrapper->set_window_title(vformat(TTR("%s - Godot Engine"), TTR("Game Workspace")));
window_wrapper->set_margins_enabled(true); window_wrapper->set_margins_enabled(true);
debugger.instantiate();
game_view = memnew(GameView(debugger, window_wrapper)); game_view = memnew(GameView(debugger, window_wrapper));
game_view->set_v_size_flags(Control::SIZE_EXPAND_FILL); 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->set_v_size_flags(Control::SIZE_EXPAND_FILL);
window_wrapper->hide(); window_wrapper->hide();
window_wrapper->connect("window_visibility_changed", callable_mp(this, &GameViewPlugin::_window_visibility_changed)); 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)); 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 #define GAME_VIEW_PLUGIN_H
#include "editor/debugger/editor_debugger_node.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_debugger_plugin.h"
#include "editor/plugins/editor_plugin.h" #include "editor/plugins/editor_plugin.h"
#include "scene/debugger/scene_debugger.h" #include "scene/debugger/scene_debugger.h"
@ -208,17 +209,22 @@ public:
class GameViewPlugin : public EditorPlugin { class GameViewPlugin : public EditorPlugin {
GDCLASS(GameViewPlugin, EditorPlugin); GDCLASS(GameViewPlugin, EditorPlugin);
#ifndef ANDROID_ENABLED
GameView *game_view = nullptr; GameView *game_view = nullptr;
WindowWrapper *window_wrapper = nullptr; WindowWrapper *window_wrapper = nullptr;
#endif
Ref<GameViewDebugger> debugger; Ref<GameViewDebugger> debugger;
String last_editor; String last_editor;
void _feature_profile_changed(); void _feature_profile_changed();
#ifndef ANDROID_ENABLED
void _window_visibility_changed(bool p_visible); void _window_visibility_changed(bool p_visible);
#endif
void _save_last_editor(const String &p_editor); void _save_last_editor(const String &p_editor);
void _focus_another_editor(); void _focus_another_editor();
bool _is_window_wrapper_enabled() const;
protected: protected:
void _notification(int p_what); void _notification(int p_what);
@ -228,14 +234,19 @@ public:
bool has_main_screen() const override { return true; } bool has_main_screen() const override { return true; }
virtual void edit(Object *p_object) override {} virtual void edit(Object *p_object) override {}
virtual bool handles(Object *p_object) const override { return false; } virtual bool handles(Object *p_object) const override { return false; }
virtual void make_visible(bool p_visible) override;
virtual void selected_notify() 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 set_window_layout(Ref<ConfigFile> p_layout) override;
virtual void get_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 void set_state(const Dictionary &p_state) override;
virtual Dictionary get_state() const override; virtual Dictionary get_state() const override;
#endif
GameViewPlugin(); GameViewPlugin();
~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)); 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 RS::get_singleton()->viewport_attach_camera(viewport->get_viewport_rid(), previewing->get_camera()); //replace
surface->queue_redraw(); surface->queue_redraw();
previewing_camera = true;
preview_camera->set_pressed(true); preview_camera->set_pressed(true);
preview_camera->show(); preview_camera->show();
} }

View File

@ -497,6 +497,24 @@ ScriptEditor *ScriptEditor::script_editor = nullptr;
/*** SCRIPT EDITOR ******/ /*** 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) { void ScriptEditor::_breaked(bool p_breaked, bool p_can_debug) {
if (external_editor_active) { if (external_editor_active) {
return; 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 // 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.path = p_resource->get_path();
se->edited_file_data.last_modified_time = FileAccess::get_modified_time(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()) { if (se->get_edit_menu()) {
se->get_edit_menu()->hide(); se->get_edit_menu()->hide();
menu_hb->add_child(se->get_edit_menu()); 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 _goto_script_line(Ref<RefCounted> p_script, int p_line);
void _set_execution(Ref<RefCounted> p_script, int p_line); void _set_execution(Ref<RefCounted> p_script, int p_line);
void _clear_execution(Ref<RefCounted> p_script); 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 _breaked(bool p_breaked, bool p_can_debug);
void _script_created(Ref<Script> p_script); void _script_created(Ref<Script> p_script);
void _set_breakpoint(Ref<RefCounted> p_script, int p_line, bool p_enabled); 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) { 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://")) { if (p_symbol.begins_with("res://") || p_symbol.begins_with("uid://")) {
EditorHelpBitTooltip::show_tooltip(code_editor->get_text_editor(), "resource||" + p_symbol); EditorHelpBitTooltip::show_tooltip(code_editor->get_text_editor(), "resource||" + p_symbol);
return; 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); String debug_value = EditorDebuggerNode::get_singleton()->get_var_value(p_symbol);
if (!debug_value.is_empty()) { if (!debug_value.is_empty()) {
constexpr int DISPLAY_LIMIT = 1024; constexpr int DISPLAY_LIMIT = 1024;
if (debug_value.size() > DISPLAY_LIMIT) { if (debug_value.size() > DISPLAY_LIMIT) {
debug_value = debug_value.left(DISPLAY_LIMIT) + "... " + TTR("(truncated)"); debug_value = debug_value.left(DISPLAY_LIMIT) + "... " + TTR("(truncated)");
} }
debug_value = debug_value.replace("[", "[lb]"); debug_value = TTR("Current value: ") + debug_value.replace("[", "[lb]");
if (doc_symbol.is_empty()) {
debug_value = p_symbol + ": " + debug_value;
} else {
debug_value = TTR("Current value: ") + debug_value;
}
} }
if (!doc_symbol.is_empty() || !debug_value.is_empty()) { 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()) { 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)); 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("v_separation", "Tree", p_config.separation_margin);
p_theme->set_constant("h_separation", "Tree", (p_config.increased_margin + 2) * EDSCALE); 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("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_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_bottom", "Tree", p_config.separation_margin);
p_theme->set_constant("inner_item_margin_left", "Tree", p_config.increased_margin * EDSCALE); 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_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(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_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_selected_color", "ItemList", p_config.mono_color);
p_theme->set_color("font_outline_color", "ItemList", p_config.font_outline_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)); 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. # Vosh <vosh4k@gmail.com>, 2022.
# 100daysummer <bobbydochev@gmail.com>, 2023, 2024. # 100daysummer <bobbydochev@gmail.com>, 2023, 2024.
# Филип Узунов <filkata@gmail.com>, 2024. # Филип Узунов <filkata@gmail.com>, 2024.
# "П@₿€л" <pavel.veselinov.georgiev@gmail.com>, 2024.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Godot Engine editor interface\n" "Project-Id-Version: Godot Engine editor interface\n"
"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n"
"POT-Creation-Date: \n" "POT-Creation-Date: \n"
"PO-Revision-Date: 2024-06-30 18:47+0000\n" "PO-Revision-Date: 2024-10-02 07:34+0000\n"
"Last-Translator: 100daysummer <bobbydochev@gmail.com>\n" "Last-Translator: \"П@₿€л\" <pavel.veselinov.georgiev@gmail.com>\n"
"Language-Team: Bulgarian <https://hosted.weblate.org/projects/godot-engine/" "Language-Team: Bulgarian <https://hosted.weblate.org/projects/godot-engine/"
"godot/bg/>\n" "godot/bg/>\n"
"Language: bg\n" "Language: bg\n"
@ -34,7 +35,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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" msgid "Main Thread"
msgstr "Главна нишка" msgstr "Главна нишка"
@ -111,6 +112,30 @@ msgstr "Джойстик 4 X-Ос"
msgid "Joystick 4 Y-Axis" msgid "Joystick 4 Y-Axis"
msgstr "Джойстик 4 Y-Ос" 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" msgid "D-pad Up"
msgstr "Кръстат бутон нагоре" msgstr "Кръстат бутон нагоре"
@ -123,9 +148,30 @@ msgstr "Кръстат бутон наляво"
msgid "D-pad Right" msgid "D-pad Right"
msgstr "Кръстат бутон надясно" 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" msgid "Joypad Button %d"
msgstr "Бутон %d на контролера" msgstr "Бутон %d на контролера"
msgid "Pressure:"
msgstr "Налягане:"
msgid "canceled" msgid "canceled"
msgstr "отменен" msgstr "отменен"
@ -135,8 +181,27 @@ msgstr "докоснат"
msgid "released" msgid "released"
msgstr "пуснат" 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" msgid "Accept"
msgstr "Потвърждаване" msgstr "Приеми"
msgid "Select" msgid "Select"
msgstr "Избери" msgstr "Избери"
@ -145,10 +210,10 @@ msgid "Cancel"
msgstr "Отказ" msgstr "Отказ"
msgid "Focus Next" msgid "Focus Next"
msgstr "Фокусиране върху следващото" msgstr "Фокусирай следващото"
msgid "Focus Prev" msgid "Focus Prev"
msgstr "Фокусиране върху предишното" msgstr "Фокусирай предишното"
msgid "Left" msgid "Left"
msgstr "Наляво" msgstr "Наляво"
@ -168,6 +233,9 @@ msgstr "Страница нагоре"
msgid "Page Down" msgid "Page Down"
msgstr "Страница надолу" msgstr "Страница надолу"
msgid "Home"
msgstr "Начало"
msgid "End" msgid "End"
msgstr "Край" msgstr "Край"
@ -186,6 +254,9 @@ msgstr "Отмяна"
msgid "Redo" msgid "Redo"
msgstr "Повторение" msgstr "Повторение"
msgid "Completion Query"
msgstr "Заявка за завършване"
msgid "New Line" msgid "New Line"
msgstr "Нов ред" msgstr "Нов ред"
@ -201,6 +272,15 @@ msgstr "Увеличаване на отстъпа"
msgid "Dedent" msgid "Dedent"
msgstr "Намаляване на отстъпа" msgstr "Намаляване на отстъпа"
msgid "Backspace"
msgstr "Стъпка Назад"
msgid "Backspace Word"
msgstr "Стъпка назад Дума"
msgid "Backspace all to Left"
msgstr "Стъпка назад всички Наляво"
msgid "Delete" msgid "Delete"
msgstr "Изтриване" msgstr "Изтриване"
@ -371,6 +451,15 @@ msgstr "Добавяне"
msgid "Action" msgid "Action"
msgstr "Действие" msgstr "Действие"
msgid "Name:"
msgstr "Име:"
msgid "Type:"
msgstr "Тип:"
msgid "Metadata name must be a valid identifier."
msgstr "Името на мета-данните трябва да бъде правилен идентификатор."
msgid "Time:" msgid "Time:"
msgstr "Време:" msgstr "Време:"
@ -459,9 +548,6 @@ msgstr "Мащаб:"
msgid "Blend Shape:" msgid "Blend Shape:"
msgstr "Форма за смесване:" msgstr "Форма за смесване:"
msgid "Type:"
msgstr "Тип:"
msgid "(Invalid, expected type: %s)" msgid "(Invalid, expected type: %s)"
msgstr "(Неправилно, очакван тип: %s)" msgstr "(Неправилно, очакван тип: %s)"
@ -628,9 +714,6 @@ msgstr "Показване само на пътечките на обектит
msgid "Group tracks by node or display them as plain list." msgid "Group tracks by node or display them as plain list."
msgstr "Групиране на пътечките по обект, или показване като общ списък." msgstr "Групиране на пътечките по обект, или показване като общ списък."
msgid "Snap:"
msgstr "Прилепване:"
msgid "Animation step value." msgid "Animation step value."
msgstr "Стойност за стъпката на анимацията." msgstr "Стойност за стъпката на анимацията."
@ -682,6 +765,12 @@ msgstr "Изберете пътечки за копиране"
msgid "Select All/None" msgid "Select All/None"
msgstr "Избиране на всичко/нищо" msgstr "Избиране на всичко/нищо"
msgid "Close"
msgstr "Затваряне"
msgid "Error!"
msgstr "Грешка!"
msgid "Add Audio Track Clip" msgid "Add Audio Track Clip"
msgstr "Добавяне на звукова пътечка" msgstr "Добавяне на звукова пътечка"
@ -776,9 +865,6 @@ msgstr "Метод-получател:"
msgid "Cannot connect signal" msgid "Cannot connect signal"
msgstr "Сигналът не може да бъде свързан" msgstr "Сигналът не може да бъде свързан"
msgid "Close"
msgstr "Затваряне"
msgid "Connect" msgid "Connect"
msgstr "Свързване" msgstr "Свързване"
@ -854,12 +940,12 @@ msgstr "Дебъгер"
msgid "Debug" msgid "Debug"
msgstr "Дебъгване" msgstr "Дебъгване"
msgid "Value"
msgstr "Стойност"
msgid "Clear" msgid "Clear"
msgstr "Изчистване" msgstr "Изчистване"
msgid "Value"
msgstr "Стойност"
msgid "Frame Time (ms)" msgid "Frame Time (ms)"
msgstr "Продължителност на кадъра (мсек)" msgstr "Продължителност на кадъра (мсек)"
@ -1048,12 +1134,6 @@ msgstr "Наистина ли искате да изтриете %d елемен
msgid "Show Dependencies" msgid "Show Dependencies"
msgstr "Показване на зависимостите" msgstr "Показване на зависимостите"
msgid "Could not create folder."
msgstr "Папката не може да бъде създадена."
msgid "Create Folder"
msgstr "Създаване на папка"
msgid "Thanks from the Godot community!" msgid "Thanks from the Godot community!"
msgstr "Благодарности от общността на Godot!" msgstr "Благодарности от общността на Godot!"
@ -1360,17 +1440,14 @@ msgstr "(стойност)"
msgid "Editor" msgid "Editor"
msgstr "Редактор" msgstr "Редактор"
msgid "Signal:" msgid "Show in FileSystem"
msgstr "Сигнал:" msgstr "Показване във файловата система"
msgid "%d matches." msgid "Open in File Manager"
msgstr "%d съвпадения." msgstr "Отваряне във файловия мениджър"
msgid "Method" msgid "Class"
msgstr "Метод" msgstr "Клас"
msgid "Signal"
msgstr "Сигнал"
msgid "Constant" msgid "Constant"
msgstr "Константа" msgstr "Константа"
@ -1381,9 +1458,21 @@ msgstr "Свойство"
msgid "Theme Property" msgid "Theme Property"
msgstr "Свойство на тема" msgstr "Свойство на тема"
msgid "Method"
msgstr "Метод"
msgid "Signal"
msgstr "Сигнал"
msgid "Annotation" msgid "Annotation"
msgstr "Анотация" msgstr "Анотация"
msgid "File"
msgstr "Файл"
msgid "%d matches."
msgstr "%d съвпадения."
msgid "Search Help" msgid "Search Help"
msgstr "Търсене в помощната информация" msgstr "Търсене в помощната информация"
@ -1414,9 +1503,6 @@ msgstr "Само свойства"
msgid "Theme Properties Only" msgid "Theme Properties Only"
msgstr "Само свойства на теми" msgstr "Само свойства на теми"
msgid "Class"
msgstr "Клас"
msgid "Move Up" msgid "Move Up"
msgstr "Преместване нагоре" msgstr "Преместване нагоре"
@ -1429,11 +1515,8 @@ msgstr "Преоразмеряване на масива…"
msgid "Resize Array" msgid "Resize Array"
msgstr "Преоразмеряване на масива" msgstr "Преоразмеряване на масива"
msgid "Metadata name must be a valid identifier." msgid "Favorites"
msgstr "Името на мета-данните трябва да бъде правилен идентификатор." msgstr "Любими"
msgid "Name:"
msgstr "Име:"
msgid "Copy Property Path" msgid "Copy Property Path"
msgstr "Копиране на пътя на свойството" msgstr "Копиране на пътя на свойството"
@ -1512,21 +1595,9 @@ msgstr "Запазване на всички сцени"
msgid "Apply MeshInstance Transforms" msgid "Apply MeshInstance Transforms"
msgstr "Прилагане на трансформациите на MeshInstance" msgstr "Прилагане на трансформациите на MeshInstance"
msgid "Quick Open..."
msgstr "Бързо отваряне..."
msgid "Quick Open Scene..."
msgstr "Бързо отваряне на сцена..."
msgid "Quick Open Script..."
msgstr "Бързо отваряне на скрипт…"
msgid "Save Scene As..." msgid "Save Scene As..."
msgstr "Запазване на сцената като..." msgstr "Запазване на сцената като..."
msgid "Current scene not saved. Open anyway?"
msgstr "Текущата сцена не е запазена. Отваряне въпреки това?"
msgid "Can't undo while mouse buttons are pressed." msgid "Can't undo while mouse buttons are pressed."
msgstr "Отмяната е невъзможна, докато бутоните на мишката са натиснати." msgstr "Отмяната е невъзможна, докато бутоните на мишката са натиснати."
@ -1620,34 +1691,6 @@ msgstr "Сцената „%s“ има нарушени зависимости:"
msgid "Clear Recent Scenes" msgid "Clear Recent Scenes"
msgstr "Изчистване на последните сцени" 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" msgid "Save & Close"
msgstr "Запазване и затваряне" msgstr "Запазване и затваряне"
@ -1684,6 +1727,15 @@ msgstr "Повторно отваряне на затворена сцена"
msgid "Save Scene" msgid "Save Scene"
msgstr "Запазване на сцената" msgstr "Запазване на сцената"
msgid "Quick Open..."
msgstr "Бързо отваряне..."
msgid "Quick Open Scene..."
msgstr "Бързо отваряне на сцена..."
msgid "Quick Open Script..."
msgstr "Бързо отваряне на скрипт…"
msgid "Export As..." msgid "Export As..."
msgstr "Изнасяне като…" msgstr "Изнасяне като…"
@ -1768,13 +1820,6 @@ msgstr "Пакет с шаблони"
msgid "Export Library" msgid "Export Library"
msgstr "Изнасяне на библиотеката" msgstr "Изнасяне на библиотеката"
msgid ""
"The following files are newer on disk.\n"
"What action should be taken?"
msgstr ""
"Следните файлове са по-нови на диска.\n"
"Кое действие трябва да се предприеме?"
msgid "New Inherited" msgid "New Inherited"
msgstr "Нова наследена сцена" msgstr "Нова наследена сцена"
@ -1805,15 +1850,15 @@ msgstr "Зареждане..."
msgid "Save As..." msgid "Save As..."
msgstr "Запазване като..." msgstr "Запазване като..."
msgid "Show in FileSystem"
msgstr "Показване във файловата система"
msgid "Convert to %s" msgid "Convert to %s"
msgstr "Преобразуване в %s" msgstr "Преобразуване в %s"
msgid "New Script..." msgid "New Script..."
msgstr "Нов скрипт..." msgstr "Нов скрипт..."
msgid "None"
msgstr "Няма"
msgid "Editor Settings" msgid "Editor Settings"
msgstr "Настройки на редактора" msgstr "Настройки на редактора"
@ -1972,6 +2017,9 @@ msgstr ""
"Филтри за изключване на файлове/папки от проекта\n" "Филтри за изключване на файлове/папки от проекта\n"
"(разделени със запетая, например: *.json, *.txt, docs/*)" "(разделени със запетая, например: *.json, *.txt, docs/*)"
msgid "Godot Project Pack"
msgstr "Проектен пакет на Godot"
msgid "Encryption" msgid "Encryption"
msgstr "Шифроване" msgstr "Шифроване"
@ -2015,9 +2063,6 @@ msgstr "Изнасяне на всичко…"
msgid "ZIP File" msgid "ZIP File"
msgstr "Файл ZIP" msgstr "Файл ZIP"
msgid "Godot Project Pack"
msgstr "Проектен пакет на Godot"
msgid "Export templates for this platform are missing:" msgid "Export templates for this platform are missing:"
msgstr "Шаблоните за изнасяне за тази система липсват:" msgstr "Шаблоните за изнасяне за тази система липсват:"
@ -2039,27 +2084,21 @@ msgstr "Разглеждане"
msgid "Confirm Path" msgid "Confirm Path"
msgstr "Потвърждаване на пътя" msgstr "Потвърждаване на пътя"
msgid "Favorites"
msgstr "Любими"
msgid "Error moving:" msgid "Error moving:"
msgstr "Грешка при преместването:" msgstr "Грешка при преместването:"
msgid "Error duplicating:" msgid "Error duplicating:"
msgstr "Грешка при дублирането:" 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." msgid "A file or folder with this name already exists."
msgstr "Вече съществува файл или папка с това име." msgstr "Вече съществува файл или папка с това име."
msgid "Duplicating file:" msgid "Duplicating file:"
msgstr "Дублиране на файла:" msgstr "Дублиране на файла:"
msgid "Create Folder"
msgstr "Създаване на папка"
msgid "New Inherited Scene" msgid "New Inherited Scene"
msgstr "Нова сцена наследник" msgstr "Нова сцена наследник"
@ -2090,9 +2129,6 @@ msgstr "Премахване от любимите"
msgid "Reimport" msgid "Reimport"
msgstr "Повторно внасяне" msgstr "Повторно внасяне"
msgid "Open in File Manager"
msgstr "Отваряне във файловия мениджър"
msgid "New Folder..." msgid "New Folder..."
msgstr "Нова папка..." msgstr "Нова папка..."
@ -2177,12 +2213,6 @@ msgstr "Избиране на текущата папка"
msgid "Select This Folder" msgid "Select This Folder"
msgstr "Избиране на тази папка" msgstr "Избиране на тази папка"
msgid "All Recognized"
msgstr "Всички разпознати"
msgid "All Files (*)"
msgstr "Всички файлове (*)"
msgid "Open a File" msgid "Open a File"
msgstr "Отваряне на файл" msgstr "Отваряне на файл"
@ -2198,6 +2228,9 @@ msgstr "Отваряне на файл или папка"
msgid "Save a File" msgid "Save a File"
msgstr "Запазване на файл" msgstr "Запазване на файл"
msgid "Could not create folder."
msgstr "Папката не може да бъде създадена."
msgid "Toggle Hidden Files" msgid "Toggle Hidden Files"
msgstr "Превключване на скритите файлове" msgstr "Превключване на скритите файлове"
@ -2219,12 +2252,12 @@ msgstr "Опресняване на файловете."
msgid "(Un)favorite current folder." msgid "(Un)favorite current folder."
msgstr "Добавяне/премахване на текущата папка в любимите." msgstr "Добавяне/премахване на текущата папка в любимите."
msgid "Toggle the visibility of hidden files."
msgstr "Превключване на видимостта на скритите файлове."
msgid "Directories & Files:" msgid "Directories & Files:"
msgstr "Папки и файлове:" msgstr "Папки и файлове:"
msgid "Toggle the visibility of hidden files."
msgstr "Превключване на видимостта на скритите файлове."
msgid "File:" msgid "File:"
msgstr "Файл:" msgstr "Файл:"
@ -2240,8 +2273,8 @@ msgstr "Пускане на персонализирана сцена."
msgid "Reload the played scene." msgid "Reload the played scene."
msgstr "Презареждане на пуснатата сцена." msgstr "Презареждане на пуснатата сцена."
msgid "Quick Run Scene..." msgid "Network Profiler"
msgstr "Бързо пускане на сцена..." msgstr "Профилиране на мрежата"
msgid "Run Project" msgid "Run Project"
msgstr "Пускане на проекта" msgstr "Пускане на проекта"
@ -2412,15 +2445,9 @@ msgstr "Управление на свойствата на обекта."
msgid "This cannot be undone. Are you sure?" msgid "This cannot be undone. Are you sure?"
msgstr "Това действие е необратимо. Наистина ли го искате?" msgstr "Това действие е необратимо. Наистина ли го искате?"
msgid "Add %d Translations"
msgstr "Добавяне на %d превода"
msgid "Remove Translation" msgid "Remove Translation"
msgstr "Премахване на превода" msgstr "Премахване на превода"
msgid "Add %d file(s) for POT generation"
msgstr "Добавяне на %d файл(а) за създаване на POT"
msgid "Remove file from POT generation" msgid "Remove file from POT generation"
msgstr "Премахване на файла от процеса за създаване на POT" msgstr "Премахване на файла от процеса за създаване на POT"
@ -2771,19 +2798,6 @@ msgstr "Дублиране на анимацията"
msgid "Change Blend Time" msgid "Change Blend Time"
msgstr "Промяна на времето на смесване" 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)." msgid "Animation position (in seconds)."
msgstr "Позиция в анимацията (в секунди)." msgstr "Позиция в анимацията (в секунди)."
@ -2845,9 +2859,6 @@ msgstr "Принудително модулиране на бялото"
msgid "Pin AnimationPlayer" msgid "Pin AnimationPlayer"
msgstr "Закачане на AnimationPlayer" msgstr "Закачане на AnimationPlayer"
msgid "Error!"
msgstr "Грешка!"
msgid "Cross-Animation Blend Times" msgid "Cross-Animation Blend Times"
msgstr "Времена на смесване между анимациите" msgstr "Времена на смесване между анимациите"
@ -3244,9 +3255,6 @@ msgstr "По средата долу"
msgid "Bottom Right" msgid "Bottom Right"
msgstr "Долу вдясно" msgstr "Долу вдясно"
msgid "Create Emission Points From Node"
msgstr "Създаване на излъчващи точки от обекта"
msgid "Edit Plugin" msgid "Edit Plugin"
msgstr "Редактиране на приставката" msgstr "Редактиране на приставката"
@ -3256,36 +3264,6 @@ msgstr "Инсталирани приставки:"
msgid "Version" msgid "Version"
msgstr "Версия" 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 "" msgid ""
"Can't determine a save path for lightmap images.\n" "Can't determine a save path for lightmap images.\n"
"Save your scene and try again." "Save your scene and try again."
@ -3294,11 +3272,6 @@ msgstr ""
"осветеност.\n" "осветеност.\n"
"Запазете сцената и опитайте отново." "Запазете сцената и опитайте отново."
msgid "Failed creating lightmap images, make sure path is writable."
msgstr ""
"Грешка при създаването на изображения с карти на осветеност. Уверете се, че "
"пътят е достъпен за запис."
msgid "Bake Lightmaps" msgid "Bake Lightmaps"
msgstr "Изпичане на карти на осветеност" msgstr "Изпичане на карти на осветеност"
@ -3315,9 +3288,6 @@ msgstr "Не могат да бъдат създадени никакви фор
msgid "Mesh is empty!" msgid "Mesh is empty!"
msgstr "Полигонната мрежа е празна!" msgstr "Полигонната мрежа е празна!"
msgid "Create Navigation Mesh"
msgstr "Създаване на навигационна полигонна мрежа"
msgid "Contained Mesh is not of type ArrayMesh." msgid "Contained Mesh is not of type ArrayMesh."
msgstr "Съдържащата се полигонна мрежа не е от тип ArrayMesh." msgstr "Съдържащата се полигонна мрежа не е от тип ArrayMesh."
@ -3329,6 +3299,9 @@ msgstr ""
msgid "No mesh to debug." msgid "No mesh to debug."
msgstr "Няма полигонна мрежа за дебъгване." msgstr "Няма полигонна мрежа за дебъгване."
msgid "Create Navigation Mesh"
msgstr "Създаване на навигационна полигонна мрежа"
msgid "MeshInstance3D lacks a Mesh." msgid "MeshInstance3D lacks a Mesh."
msgstr "В MeshInstance3D няма полигонна мрежа." msgstr "В MeshInstance3D няма полигонна мрежа."
@ -3403,9 +3376,15 @@ msgstr "Източник за полигонна мрежа:"
msgid "Mesh Up Axis:" msgid "Mesh Up Axis:"
msgstr "Ос сочеща нагоре за полигонната мрежа:" msgstr "Ос сочеща нагоре за полигонната мрежа:"
msgid "Please Confirm..."
msgstr "Моля, потвърдете..."
msgid "Objects: %d\n" msgid "Objects: %d\n"
msgstr "Обекти: %d\n" msgstr "Обекти: %d\n"
msgid "Translating:"
msgstr "Транслиране:"
msgid "Top View." msgid "Top View."
msgstr "Изглед отгоре." msgstr "Изглед отгоре."
@ -3430,18 +3409,12 @@ msgstr "Подравняване на трансформацията с изгл
msgid "Align Rotation with View" msgid "Align Rotation with View"
msgstr "Подравняване на ротацията с изгледа" msgstr "Подравняване на ротацията с изгледа"
msgid "None"
msgstr "Няма"
msgid "Rotate" msgid "Rotate"
msgstr "Ротация" msgstr "Ротация"
msgid "Translate" msgid "Translate"
msgstr "Транслиране" msgstr "Транслиране"
msgid "Translating:"
msgstr "Транслиране:"
msgid "Rotating %s degrees." msgid "Rotating %s degrees."
msgstr "Завъртане на %s градуса." msgstr "Завъртане на %s градуса."
@ -3665,12 +3638,39 @@ msgstr "Прилепване при скалиране (%):"
msgid "Viewport Settings" msgid "Viewport Settings"
msgstr "Настройки на прозореца за изглед" 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" msgid "Delete Point"
msgstr "Изтриване на точка" msgstr "Изтриване на точка"
msgid "Please Confirm..."
msgstr "Моля, потвърдете..."
msgid "Move Joint" msgid "Move Joint"
msgstr "Преместване на ставата" msgstr "Преместване на ставата"
@ -3802,9 +3802,6 @@ msgstr "Следващ скрипт"
msgid "Previous Script" msgid "Previous Script"
msgstr "Предишен скрипт" msgstr "Предишен скрипт"
msgid "File"
msgstr "Файл"
msgid "Open..." msgid "Open..."
msgstr "Отваряне…" msgstr "Отваряне…"
@ -4024,6 +4021,19 @@ msgstr "Изтриване на анимацията"
msgid "Animation Frames:" msgid "Animation Frames:"
msgstr "Кадри на анимацията:" 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" msgid "Zoom Reset"
msgstr "Връщане на оригиналния мащаб" msgstr "Връщане на оригиналния мащаб"
@ -4033,6 +4043,9 @@ msgstr "Избиране на кадри"
msgid "Size" msgid "Size"
msgstr "Размер" msgstr "Размер"
msgid "Auto Slice"
msgstr "Автоматично отрязване"
msgid "Reload" msgid "Reload"
msgstr "Презареждане" msgstr "Презареждане"
@ -4051,9 +4064,6 @@ msgstr "Прилепване към пикселите"
msgid "Grid Snap" msgid "Grid Snap"
msgstr "Прилепване към решетката" msgstr "Прилепване към решетката"
msgid "Auto Slice"
msgstr "Автоматично отрязване"
msgid "Step:" msgid "Step:"
msgstr "Стъпка:" msgstr "Стъпка:"
@ -4592,15 +4602,6 @@ msgstr "Посоченият път не съществува."
msgid "New Game Project" msgid "New Game Project"
msgstr "Нов игрален проект" msgstr "Нов игрален проект"
msgid "Import & Edit"
msgstr "Внасяне и редактиране"
msgid "Create & Edit"
msgstr "Създаване и редактиране"
msgid "Install & Edit"
msgstr "Инсталиране и редактиране"
msgid "Project Name:" msgid "Project Name:"
msgstr "Име на проекта:" msgstr "Име на проекта:"
@ -4828,23 +4829,11 @@ msgstr "Неправилен базов път."
msgid "Wrong extension chosen." msgid "Wrong extension chosen."
msgstr "Избрано е грешно разширение." msgstr "Избрано е грешно разширение."
msgid "Next Plane"
msgstr "Следваща равнина"
msgid "Previous Plane"
msgstr "Предходна равнина"
msgid "Plane:"
msgstr "Равнина:"
msgid "Next Floor"
msgstr "Следващ под"
msgid "Previous Floor" msgid "Previous Floor"
msgstr "Предходен под" msgstr "Предходен под"
msgid "Floor:" msgid "Next Floor"
msgstr "Под:" msgstr "Следващ под"
msgid "Edit X Axis" msgid "Edit X Axis"
msgstr "Редактиране на оста X" msgstr "Редактиране на оста X"
@ -4855,18 +4844,6 @@ msgstr "Редактиране на оста Y"
msgid "Edit Z Axis" msgid "Edit Z Axis"
msgstr "Редактиране на оста Z" msgstr "Редактиране на оста Z"
msgid "Paste Selects"
msgstr "Поставяне на избраното"
msgid "Cut Selection"
msgstr "Изрязване на избраното"
msgid "Clear Selection"
msgstr "Изчистване на избраното"
msgid "Fill Selection"
msgstr "Запълване на избраното"
msgid "GridMap Settings" msgid "GridMap Settings"
msgstr "Настройки на GridMap" msgstr "Настройки на GridMap"
@ -4881,9 +4858,6 @@ msgstr "Недостатъчно байтове за разкодиране ил
msgid "Config" msgid "Config"
msgstr "Конфигурация" msgstr "Конфигурация"
msgid "Network Profiler"
msgstr "Профилиране на мрежата"
msgid "Not possible to add a new property to synchronize without a root." msgid "Not possible to add a new property to synchronize without a root."
msgstr "Добавянето на ново свойство за синхронизиране без корен е невъзможно." msgstr "Добавянето на ново свойство за синхронизиране без корен е невъзможно."
@ -4956,26 +4930,12 @@ msgstr "Липсва папката „build-tools“!"
msgid "Unable to find Android SDK build-tools' apksigner command." msgid "Unable to find Android SDK build-tools' apksigner command."
msgstr "Не е намерена командата „apksigner “ от Android SDK build-tools." 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." msgid "Could not find keystore, unable to export."
msgstr "Не е намерено хранилище за ключове. Изнасянето е невъзможно." msgstr "Не е намерено хранилище за ключове. Изнасянето е невъзможно."
msgid "'apksigner' returned with error #%d" msgid "'apksigner' returned with error #%d"
msgstr "„apksigner“ завърши с грешка #%d" msgstr "„apksigner“ завърши с грешка #%d"
msgid "Verifying %s..."
msgstr "Потвърждаване на %s..."
msgid "'apksigner' verification of %s failed."
msgstr "Проверката на %s от „apksigner“ беше неуспешна."
msgid "Exporting for Android" msgid "Exporting for Android"
msgstr "Изнасяне за Android" msgstr "Изнасяне за Android"
@ -4997,9 +4957,6 @@ msgstr "Компилиране на проект за Android (gradle)"
msgid "Moving output" msgid "Moving output"
msgstr "Преместване на изходящите данни" msgstr "Преместване на изходящите данни"
msgid "Package not found: \"%s\"."
msgstr "Пакетът не е намерен: „%s“."
msgid "Creating APK..." msgid "Creating APK..."
msgstr "Създаване на APK…" msgstr "Създаване на APK…"

View File

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

View File

@ -27,13 +27,14 @@
# Azor Carreras Alcaraz <azorcarreras@gmail.com>, 2024. # Azor Carreras Alcaraz <azorcarreras@gmail.com>, 2024.
# Alberto Blanco Celdrán <flaberto.abc@gmail.com>, 2024. # Alberto Blanco Celdrán <flaberto.abc@gmail.com>, 2024.
# Luna Moreno <akaluna99@gmail.com>, 2024. # Luna Moreno <akaluna99@gmail.com>, 2024.
# Lukas Tenbrink <lukas.tenbrink@gmail.com>, 2025.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Godot Engine editor interface\n" "Project-Id-Version: Godot Engine editor interface\n"
"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n"
"POT-Creation-Date: \n" "POT-Creation-Date: \n"
"PO-Revision-Date: 2024-09-03 22:09+0000\n" "PO-Revision-Date: 2025-01-09 13:44+0000\n"
"Last-Translator: Luna Moreno <akaluna99@gmail.com>\n" "Last-Translator: Lukas Tenbrink <lukas.tenbrink@gmail.com>\n"
"Language-Team: Catalan <https://hosted.weblate.org/projects/godot-engine/" "Language-Team: Catalan <https://hosted.weblate.org/projects/godot-engine/"
"godot/ca/>\n" "godot/ca/>\n"
"Language: ca\n" "Language: ca\n"
@ -41,7 +42,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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" msgid "Main Thread"
msgstr "Fil principal" msgstr "Fil principal"
@ -503,6 +504,12 @@ msgstr "Acció"
msgid "Deadzone" msgid "Deadzone"
msgstr "Zona morta" msgstr "Zona morta"
msgid "Name:"
msgstr "Nom:"
msgid "Type:"
msgstr "Tipus:"
msgid "Time:" msgid "Time:"
msgstr "Temps:" msgstr "Temps:"
@ -614,16 +621,6 @@ msgstr "Canvia la durada de l'Animació"
msgid "Change Animation Loop" msgid "Change Animation Loop"
msgstr "Modifica el bucle d'Animació" 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..." msgid "Property Track..."
msgstr "Pista de Propietats..." msgstr "Pista de Propietats..."
@ -708,9 +705,6 @@ msgstr "Escala:"
msgid "Blend Shape:" msgid "Blend Shape:"
msgstr "Forma de Barreja:" msgstr "Forma de Barreja:"
msgid "Type:"
msgstr "Tipus:"
msgid "(Invalid, expected type: %s)" msgid "(Invalid, expected type: %s)"
msgstr "(No vàlid, tipus esperat: %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." msgid "Group tracks by node or display them as plain list."
msgstr "Agrupa les pistes per node o mostra-les en una llista." msgstr "Agrupa les pistes per node o mostra-les en una llista."
msgid "Snap:"
msgstr "Ajustar:"
msgid "Animation step value." msgid "Animation step value."
msgstr "Valor del pas d'Animació." msgstr "Valor del pas d'Animació."
@ -1181,6 +1172,12 @@ msgstr "Seleccioneu les Pistes a Copiar"
msgid "Select All/None" msgid "Select All/None"
msgstr "(Des)selecciona-ho tot" msgstr "(Des)selecciona-ho tot"
msgid "Close"
msgstr "Tancar"
msgid "Error!"
msgstr "Error !"
msgid "Add Audio Track Clip" msgid "Add Audio Track Clip"
msgstr "Afegir Clip de Pista d'Àudio" 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" msgid "Cannot connect signal"
msgstr "No es pot connectar el senyal" msgstr "No es pot connectar el senyal"
msgid "Close"
msgstr "Tancar"
msgid "Connect" msgid "Connect"
msgstr "Connectar" msgstr "Connectar"
@ -1381,6 +1375,9 @@ msgstr "Instància:"
msgid "Toggle Visibility" msgid "Toggle Visibility"
msgstr "Visibilitat" msgstr "Visibilitat"
msgid "Clear"
msgstr "Neteja"
msgid "Monitors" msgid "Monitors"
msgstr "Monitors" msgstr "Monitors"
@ -1399,9 +1396,6 @@ msgstr "Atura"
msgid "Start" msgid "Start"
msgstr "Inicia" msgstr "Inicia"
msgid "Clear"
msgstr "Neteja"
msgid "Measure:" msgid "Measure:"
msgstr "Mesura:" msgstr "Mesura:"
@ -1606,12 +1600,6 @@ msgstr "Posseeix"
msgid "Resources Without Explicit Ownership:" msgid "Resources Without Explicit Ownership:"
msgstr "Recursos Sense Propietat Explícita:" 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!" msgid "Thanks from the Godot community!"
msgstr "Gràcies de la part de la Comunitat del Godot!" 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" msgid "Open Audio Bus Layout"
msgstr "Obre un Disseny de Bus d'Àudio" msgstr "Obre un Disseny de Bus d'Àudio"
msgid "There is no '%s' file." msgid "Error saving file: %s"
msgstr "No hi ha cap fitxer '%s'." msgstr "S'ha produit un error al desar el fitxer! %s"
msgid "Layout:" msgid "Layout:"
msgstr "Disseny:" 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" msgid "Add Bus"
msgstr "Afegeix Bus" msgstr "Afegeix Bus"
@ -2087,20 +2069,14 @@ msgstr ""
msgid "Editor" msgid "Editor"
msgstr "Editor" msgstr "Editor"
msgid "Property:" msgid "Show in FileSystem"
msgstr "Propietat:" msgstr "Mostrar en el Sistema de Fitxers"
msgid "Signal:" msgid "Open in File Manager"
msgstr "Senyal:" msgstr "Obrir en el Gestor de Fitxers"
msgid "%d matches." msgid "Class"
msgstr "%d coincidències." msgstr "Classe"
msgid "Method"
msgstr "Mètode"
msgid "Signal"
msgstr "Senyal"
msgid "Constant" msgid "Constant"
msgstr "Constant" msgstr "Constant"
@ -2111,6 +2087,18 @@ msgstr "Propietat"
msgid "Theme Property" msgid "Theme Property"
msgstr "Propietats del tema" 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" msgid "Search Help"
msgstr "Cerca Ajuda" msgstr "Cerca Ajuda"
@ -2144,9 +2132,6 @@ msgstr "Només Propietats del Tema"
msgid "Member Type" msgid "Member Type"
msgstr "Tipus de Membre" msgstr "Tipus de Membre"
msgid "Class"
msgstr "Classe"
msgid "Move Up" msgid "Move Up"
msgstr "Mou Amunt" msgstr "Mou Amunt"
@ -2159,8 +2144,8 @@ msgstr "Redimensiona la Matriu"
msgid "Set %s" msgid "Set %s"
msgstr "Definir %s" msgstr "Definir %s"
msgid "Name:" msgid "Favorites"
msgstr "Nom:" msgstr "Preferits"
msgid "Creating Mesh Previews" msgid "Creating Mesh Previews"
msgstr "Creant Previsualitzacions de Malles" msgstr "Creant Previsualitzacions de Malles"
@ -2278,15 +2263,6 @@ msgstr ""
msgid "Open Base Scene" msgid "Open Base Scene"
msgstr "Obre una Escena Base" 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 "" msgid ""
"A root node is required to save the scene. You can add a root node using the " "A root node is required to save the scene. You can add a root node using the "
"Scene tree dock." "Scene tree dock."
@ -2297,9 +2273,6 @@ msgstr ""
msgid "Save Scene As..." msgid "Save Scene As..."
msgstr "Anomena i Desa l'Escena..." 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." msgid "Can't undo while mouse buttons are pressed."
msgstr "No es pot desfer mentre hi ha botons del ratolí premuts." 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" msgid "Clear Recent Scenes"
msgstr "Buida les Escenes Recents" 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" msgid "Default"
msgstr "Predeterminat" msgstr "Predeterminat"
@ -2455,6 +2400,15 @@ msgstr "Obre Recent"
msgid "Save Scene" msgid "Save Scene"
msgstr "Desa Escena" 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..." msgid "MeshLibrary..."
msgstr "Biblioteca de Models (MeshLibrary)..." msgstr "Biblioteca de Models (MeshLibrary)..."
@ -2574,13 +2528,6 @@ msgstr "Exporta Biblioteca"
msgid "Open & Run a Script" msgid "Open & Run a Script"
msgstr "Obre i Executa un 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" msgid "New Inherited"
msgstr "Nou Heretat" msgstr "Nou Heretat"
@ -2690,9 +2637,6 @@ msgstr "Fes-lo Únic"
msgid "Save As..." msgid "Save As..."
msgstr "Anomena i Desa..." msgstr "Anomena i Desa..."
msgid "Show in FileSystem"
msgstr "Mostrar en el Sistema de Fitxers"
msgid "New %s" msgid "New %s"
msgstr "Nou %s" msgstr "Nou %s"
@ -2702,6 +2646,9 @@ msgstr "Script Nou..."
msgid "Write your logic in the _run() method." msgid "Write your logic in the _run() method."
msgstr "Escriu la lògica en el mètode _run()." msgstr "Escriu la lògica en el mètode _run()."
msgid "None"
msgstr "Cap"
msgid "Editor Settings" msgid "Editor Settings"
msgstr "Configuració de l'Editor" msgstr "Configuració de l'Editor"
@ -2822,6 +2769,16 @@ msgstr "Extraient Plantilles d'Exportació"
msgid "Importing:" msgid "Importing:"
msgstr "Importació:" 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" msgid "Uncompressing Android Build Sources"
msgstr "Descomprimint les Fonts de Compilació d'Android" msgstr "Descomprimint les Fonts de Compilació d'Android"
@ -2831,11 +2788,6 @@ msgstr "Gestor de Plantilles d'Exportació"
msgid "Current Version:" msgid "Current Version:"
msgstr "Versió Actual:" 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." msgid "Export templates are installed and ready to be used."
msgstr "" msgstr ""
"Les plantilles d'exportació estan instal·lades i llestes per a ser " "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 " "Descarrega i instal·la plantilles per a la versió actual des del millor "
"mirall possible." "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." msgid "Install templates from a local file."
msgstr "Instal·la plantilles des d'un fitxer local." msgstr "Instal·la plantilles des d'un fitxer local."
@ -2965,9 +2912,6 @@ msgstr "Gestor de Plantilles d'Exportació"
msgid "Browse" msgid "Browse"
msgstr "Navega" msgstr "Navega"
msgid "Favorites"
msgstr "Preferits"
msgid "View items as a grid of thumbnails." msgid "View items as a grid of thumbnails."
msgstr "Visualitza en una quadrícula de miniatures." msgstr "Visualitza en una quadrícula de miniatures."
@ -3004,6 +2948,9 @@ msgstr "S'està duplicant el fitxer:"
msgid "Duplicating folder:" msgid "Duplicating folder:"
msgstr "S'està duplicant el directori:" msgstr "S'està duplicant el directori:"
msgid "Create Folder"
msgstr "Crea un Directori"
msgid "New Inherited Scene" msgid "New Inherited Scene"
msgstr "Nova Escena Heretada" msgstr "Nova Escena Heretada"
@ -3025,9 +2972,6 @@ msgstr "Eliminar de Preferits"
msgid "Reimport" msgid "Reimport"
msgstr "ReImportar" msgstr "ReImportar"
msgid "Open in File Manager"
msgstr "Obrir en el Gestor de Fitxers"
msgid "New Folder..." msgid "New Folder..."
msgstr "Nou Directori..." msgstr "Nou Directori..."
@ -3132,12 +3076,6 @@ msgstr "Selecciona el Directori Actual"
msgid "Select This Folder" msgid "Select This Folder"
msgstr "Seleccionar aquest Directori" msgstr "Seleccionar aquest Directori"
msgid "All Recognized"
msgstr "Tots Reconeguts"
msgid "All Files (*)"
msgstr "Tots els Fitxers (*)"
msgid "Open a File" msgid "Open a File"
msgstr "Obre un Fitxer" msgstr "Obre un Fitxer"
@ -3153,6 +3091,9 @@ msgstr "Obre un Fitxer o Directori"
msgid "Save a File" msgid "Save a File"
msgstr "Desa un Fitxer" msgstr "Desa un Fitxer"
msgid "Could not create folder."
msgstr "No s'ha pogut crear el directori."
msgid "Go Back" msgid "Go Back"
msgstr "Enrere" msgstr "Enrere"
@ -3195,15 +3136,18 @@ msgstr "Actualitzar fitxers."
msgid "(Un)favorite current folder." msgid "(Un)favorite current folder."
msgstr "Eliminar carpeta actual de preferits." msgstr "Eliminar carpeta actual de preferits."
msgid "Toggle the visibility of hidden files."
msgstr "Commutar visibilitat dels fitxers ocults."
msgid "Directories & Files:" msgid "Directories & Files:"
msgstr "Directoris i Fitxers:" msgstr "Directoris i Fitxers:"
msgid "Toggle the visibility of hidden files."
msgstr "Commutar visibilitat dels fitxers ocults."
msgid "Preview:" msgid "Preview:"
msgstr "Vista prèvia:" msgstr "Vista prèvia:"
msgid "Filter"
msgstr "Filtre"
msgid "File:" msgid "File:"
msgstr "Fitxer:" msgstr "Fitxer:"
@ -3213,8 +3157,8 @@ msgstr "Reprodueix el projecte."
msgid "Play the edited scene." msgid "Play the edited scene."
msgstr "Reprodueix l'escena editada." msgstr "Reprodueix l'escena editada."
msgid "Quick Run Scene..." msgid "Network Profiler"
msgstr "Execució Ràpida de l'Escena..." msgstr "Perfilador de Xarxa"
msgid "Play This Scene" msgid "Play This Scene"
msgstr "Reprodueix aquesta Escena" msgstr "Reprodueix aquesta Escena"
@ -3576,7 +3520,7 @@ msgid "Storage"
msgstr "Emmagatzematge" msgstr "Emmagatzematge"
msgid "Toggle Autoplay" msgid "Toggle Autoplay"
msgstr "Reproducció Automàtica" msgstr "Reproducció Automàtica"
msgid "Create New Animation" msgid "Create New Animation"
msgstr "Crea una Nova Animació" msgstr "Crea una Nova Animació"
@ -3605,18 +3549,6 @@ msgstr "Mesclar Següent Canviat"
msgid "Change Blend Time" msgid "Change Blend Time"
msgstr "Modifica el Temps de Mescla" 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)." msgid "Animation position (in seconds)."
msgstr "Posició de l'Animació (en segons)." msgstr "Posició de l'Animació (en segons)."
@ -3677,9 +3609,6 @@ msgstr "Inclou Gizmos (3D)"
msgid "Pin AnimationPlayer" msgid "Pin AnimationPlayer"
msgstr "Fixar AnimationPlayer" msgstr "Fixar AnimationPlayer"
msgid "Error!"
msgstr "Error !"
msgid "Cross-Animation Blend Times" msgid "Cross-Animation Blend Times"
msgstr "Temps de mescla entre Animacions" msgstr "Temps de mescla entre Animacions"
@ -4111,30 +4040,6 @@ msgstr "CentreV Ample"
msgid "Full Rect" msgid "Full Rect"
msgstr "Rect. Complet" 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" msgid "Load Curve Preset"
msgstr "Carrega un ajustament per la Corba" msgstr "Carrega un ajustament per la Corba"
@ -4248,38 +4153,9 @@ msgstr "Modifica el Radi de Llum"
msgid "Change Notifier AABB" msgid "Change Notifier AABB"
msgstr "Canviar Notificador 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" msgid "Create Occluder Polygon"
msgstr "Crea un Polígon Oclusor" 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" msgid "Bake Lightmaps"
msgstr "Precalcular Lightmaps" msgstr "Precalcular Lightmaps"
@ -4289,9 +4165,6 @@ msgstr "No s'ha pogut crear una forma de col·lisió Trimesh."
msgid "Mesh is empty!" msgid "Mesh is empty!"
msgstr "La malla és buida!" msgstr "La malla és buida!"
msgid "Create Navigation Mesh"
msgstr "Crea un malla de Navegació"
msgid "Contained Mesh is not of type ArrayMesh." msgid "Contained Mesh is not of type ArrayMesh."
msgstr "La Malla continguda no és del tipus 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." msgid "Mesh has no UV in layer %d."
msgstr "La malla no té UV a la capa %d." msgstr "La malla no té UV a la capa %d."
msgid "Create Navigation Mesh"
msgstr "Crea un malla de Navegació"
msgid "Create Outline" msgid "Create Outline"
msgstr "Crea el Contorn" msgstr "Crea el Contorn"
@ -4419,11 +4295,8 @@ msgstr "Quantitat:"
msgid "Populate" msgid "Populate"
msgstr "Omple" msgstr "Omple"
msgid "Edit Poly" msgid "Please Confirm..."
msgstr "Edita Polígon" msgstr "Confirmeu..."
msgid "Edit Poly (Remove Point)"
msgstr "Edita el Polígon (Elimina un Punt)"
msgid "Create Navigation Polygon" msgid "Create Navigation Polygon"
msgstr "Crea un Polígon de Navegació" msgstr "Crea un Polígon de Navegació"
@ -4479,9 +4352,6 @@ msgstr "Alinear Transformació amb la Vista"
msgid "Align Rotation with View" msgid "Align Rotation with View"
msgstr "Alinea Rotació amb la Vista" msgstr "Alinea Rotació amb la Vista"
msgid "None"
msgstr "Cap"
msgid "Rotate" msgid "Rotate"
msgstr "Rotar" msgstr "Rotar"
@ -4671,6 +4541,54 @@ msgstr "Pre"
msgid "Post" msgid "Post"
msgstr "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" msgid "Remove Point from Curve"
msgstr "Elimina un Punt de la Corba" msgstr "Elimina un Punt de la Corba"
@ -4707,9 +4625,6 @@ msgstr "Elimina el Punt"
msgid "Close Curve" msgid "Close Curve"
msgstr "Tanca la Corba" msgstr "Tanca la Corba"
msgid "Please Confirm..."
msgstr "Confirmeu..."
msgid "Mirror Handle Angles" msgid "Mirror Handle Angles"
msgstr "Reflecteix els Angles de la Nansa" 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" msgid "Sync Bones"
msgstr "Sincronitzar Ossos" 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" msgid "Create UV Map"
msgstr "Crea un Mapa UV" msgstr "Crea un Mapa UV"
@ -4812,21 +4720,15 @@ msgstr "Transformar Polígon"
msgid "Paint Bone Weights" msgid "Paint Bone Weights"
msgstr "Pintar Pes dels Ossos" 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" msgid "Points"
msgstr "Punts" msgstr "Punts"
msgid "Polygons" msgid "Polygons"
msgstr "Polígons" msgstr "Polígons"
msgid "UV"
msgstr "UV"
msgid "Bones" msgid "Bones"
msgstr "Ossos" msgstr "Ossos"
@ -4895,6 +4797,12 @@ msgstr "Sincronitzar Ossos amb el Polígon"
msgid "Create Polygon3D" msgid "Create Polygon3D"
msgstr "Crear Polígon3D" 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!" msgid "ERROR: Couldn't load resource!"
msgstr "Error: No es pot carregar el recurs!" 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" msgid "Sort"
msgstr "Ordena" msgstr "Ordena"
msgid "File"
msgstr "Fitxer"
msgid "Open..." msgid "Open..."
msgstr "Obrir..." msgstr "Obrir..."
@ -5054,9 +4959,6 @@ msgstr ""
msgid "Go to Function" msgid "Go to Function"
msgstr "Vés a la Funció" msgstr "Vés a la Funció"
msgid "Lookup Symbol"
msgstr "Cercar Símbol"
msgid "Pick Color" msgid "Pick Color"
msgstr "Tria un Color" msgstr "Tria un Color"
@ -5132,6 +5034,9 @@ msgstr "Anar a la Funció..."
msgid "Go to Line..." msgid "Go to Line..."
msgstr "Anar a la Línia..." msgstr "Anar a la Línia..."
msgid "Lookup Symbol"
msgstr "Cercar Símbol"
msgid "Toggle Breakpoint" msgid "Toggle Breakpoint"
msgstr "Commuta el punt d'Interrupció" msgstr "Commuta el punt d'Interrupció"
@ -5228,6 +5133,18 @@ msgstr "Animacions:"
msgid "Animation Frames:" msgid "Animation Frames:"
msgstr "Fotogrames d'Animació:" 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" msgid "Zoom Reset"
msgstr "Restablir zoom" msgstr "Restablir zoom"
@ -5237,6 +5154,9 @@ msgstr "Seleccionar Fotogrames"
msgid "Size" msgid "Size"
msgstr "Mida" msgstr "Mida"
msgid "Auto Slice"
msgstr "Auto Tall"
msgid "Reload" msgid "Reload"
msgstr "Torna a Carregar" msgstr "Torna a Carregar"
@ -5258,9 +5178,6 @@ msgstr "Ajustament de Píxels"
msgid "Grid Snap" msgid "Grid Snap"
msgstr "Ajustar a la Quadrícula" msgstr "Ajustar a la Quadrícula"
msgid "Auto Slice"
msgstr "Auto Tall"
msgid "Step:" msgid "Step:"
msgstr "Pas:" msgstr "Pas:"
@ -5777,18 +5694,9 @@ msgstr ""
msgid "The following files failed extraction from package:" msgid "The following files failed extraction from package:"
msgstr "Ha fracassat l'extracció del paquet dels següents fitxers:" 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:" msgid "Install Project:"
msgstr "Instal·la el Projecte:" msgstr "Instal·la el Projecte:"
msgid "Install & Edit"
msgstr "Instal·la i Edita"
msgid "Project Name:" msgid "Project Name:"
msgstr "Nom del Projecte:" msgstr "Nom del Projecte:"
@ -6065,32 +5973,14 @@ msgstr "No Disponible"
msgid "Wrong extension chosen." msgid "Wrong extension chosen."
msgstr "L'extensió triada no és correcta." msgstr "L'extensió triada no és correcta."
msgid "Change Cylinder Radius" msgid "GridMap Delete Selection"
msgstr "Canviar Radi del Cilindre" msgstr "Elimina la Selecció del GridMap"
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 "Previous Floor" msgid "Previous Floor"
msgstr "Planta Anterior" msgstr "Planta Anterior"
msgid "Floor:" msgid "Next Floor"
msgstr "Planta:" msgstr "Planta Següent"
msgid "GridMap Delete Selection"
msgstr "Elimina la Selecció del GridMap"
msgid "Edit X Axis" msgid "Edit X Axis"
msgstr "Edita l'Eix X" msgstr "Edita l'Eix X"
@ -6101,6 +5991,12 @@ msgstr "Edita l'Eix Y"
msgid "Edit Z Axis" msgid "Edit Z Axis"
msgstr "Edita l'Eix Z" msgstr "Edita l'Eix Z"
msgid "GridMap Settings"
msgstr "Configuració del GridMap"
msgid "Pick Distance:"
msgstr "Trieu la distància:"
msgid "Cursor Rotate X" msgid "Cursor Rotate X"
msgstr "Gira X en el Cursor" msgstr "Gira X en el Cursor"
@ -6110,36 +6006,6 @@ msgstr "Gira Y en el Cursor"
msgid "Cursor Rotate Z" msgid "Cursor Rotate Z"
msgstr "Gira Z en el Cursor" 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" msgid "Class name can't be a reserved keyword"
msgstr "El nom de la classe no pot ser una paraula clau reservada" msgstr "El nom de la classe no pot ser una paraula clau reservada"
@ -6158,9 +6024,6 @@ msgstr "RPC Sortint"
msgid "Config" msgid "Config"
msgstr "Configuració" msgstr "Configuració"
msgid "Network Profiler"
msgstr "Perfilador de Xarxa"
msgid "A NavigationMesh resource must be set or created for this node to work." msgid "A NavigationMesh resource must be set or created for this node to work."
msgstr "" msgstr ""
"Cal crear o establir un recurs de tipus NavigationMesh per al correcte " "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" msgid "Could not install to device: %s"
msgstr "No s'ha pogut instal·lar al dispositiu: %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!" msgid "Could not write expansion package file!"
msgstr "No s'ha pogut escriure el fitxer del paquet d'expansió!" msgstr "No s'ha pogut escriure el fitxer del paquet d'expansió!"
@ -6266,8 +6126,5 @@ msgstr ""
msgid "Invalid source for shader." msgid "Invalid source for shader."
msgstr "Font no vàlida pel Shader." msgstr "Font no vàlida pel Shader."
msgid "Filter"
msgstr "Filtre"
msgid "Constants cannot be modified." msgid "Constants cannot be modified."
msgstr "Les constants no es poden modificar." 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. # Diego22rct <diegorafaelcisnerostafur@gmail.com>, 2024.
# Carlos Mena <menacarlos.asir@gmail.com>, 2024. # Carlos Mena <menacarlos.asir@gmail.com>, 2024.
# Franco Ezequiel Ibañez <francoibanez.dev@gmail.com>, 2024. # Franco Ezequiel Ibañez <francoibanez.dev@gmail.com>, 2024.
# David Pepice <davitogaming@gmail.com>, 2025.
# LCDF <lcdf1001@gmail.com>, 2025.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Godot Engine editor interface\n" "Project-Id-Version: Godot Engine editor interface\n"
"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n"
"POT-Creation-Date: \n" "POT-Creation-Date: \n"
"PO-Revision-Date: 2024-03-18 13:37+0000\n" "PO-Revision-Date: 2025-01-29 23:00+0000\n"
"Last-Translator: Franco Ezequiel Ibañez <francoibanez.dev@gmail.com>\n" "Last-Translator: LCDF <lcdf1001@gmail.com>\n"
"Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/godot-" "Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/godot-"
"engine/godot/es_AR/>\n" "engine/godot/es_AR/>\n"
"Language: es_AR\n" "Language: es_AR\n"
@ -45,7 +47,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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" msgid "Main Thread"
msgstr "Hilo Principal" msgstr "Hilo Principal"
@ -197,6 +199,9 @@ msgstr "Bottón de Joypad %d"
msgid "Pressure:" msgid "Pressure:"
msgstr "Presión:" msgstr "Presión:"
msgid "touched"
msgstr "tocado"
msgid "released" msgid "released"
msgstr "Publicado" msgstr "Publicado"
@ -474,6 +479,9 @@ msgstr "Filtrar por nombre"
msgid "Clear All" msgid "Clear All"
msgstr "Limpiar Todo" msgstr "Limpiar Todo"
msgid "Clear all search filters."
msgstr "Borrar todos los filtros de búsqueda"
msgid "Add New Action" msgid "Add New Action"
msgstr "Agregar Acción Nueva" msgstr "Agregar Acción Nueva"
@ -489,6 +497,12 @@ msgstr "Acción"
msgid "Deadzone" msgid "Deadzone"
msgstr "Zona muerta" msgstr "Zona muerta"
msgid "Name:"
msgstr "Nombre:"
msgid "Type:"
msgstr "Tipo:"
msgid "Time:" msgid "Time:"
msgstr "Tiempo:" msgstr "Tiempo:"
@ -603,16 +617,6 @@ msgstr "Cambiar Duración de la Animación"
msgid "Change Animation Loop" msgid "Change Animation Loop"
msgstr "Cambiar Loop de Animación" 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..." msgid "Property Track..."
msgstr "Pista de Propiedades..." msgstr "Pista de Propiedades..."
@ -697,9 +701,6 @@ msgstr "Escala:"
msgid "Blend Shape:" msgid "Blend Shape:"
msgstr "Forma Combinada:" msgstr "Forma Combinada:"
msgid "Type:"
msgstr "Tipo:"
msgid "(Invalid, expected type: %s)" msgid "(Invalid, expected type: %s)"
msgstr "(Inválido, tipo esperado: %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." msgid "Group tracks by node or display them as plain list."
msgstr "Agrupar las pistas por nodo o mostrarlas como una lista plana." msgstr "Agrupar las pistas por nodo o mostrarlas como una lista plana."
msgid "Snap:"
msgstr "Ajuste:"
msgid "Animation step value." msgid "Animation step value."
msgstr "Valor de paso de animación." msgstr "Valor de paso de animación."
@ -912,6 +910,12 @@ msgstr "Elegir Pistas a Copiar"
msgid "Select All/None" msgid "Select All/None"
msgstr "Seleccionar Todo/Ninguno" msgstr "Seleccionar Todo/Ninguno"
msgid "Close"
msgstr "Cerrar"
msgid "Error!"
msgstr "Error!"
msgid "Add Audio Track Clip" msgid "Add Audio Track Clip"
msgstr "Agregar Clip de Pista de Audio" 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" msgid "Cannot connect signal"
msgstr "No se puede conectar la señal" msgstr "No se puede conectar la señal"
msgid "Close"
msgstr "Cerrar"
msgid "Connect" msgid "Connect"
msgstr "Conectar" msgstr "Conectar"
@ -1112,6 +1113,9 @@ msgstr "Instancia:"
msgid "Toggle Visibility" msgid "Toggle Visibility"
msgstr "Act/Desact. Visibilidad" msgstr "Act/Desact. Visibilidad"
msgid "Clear"
msgstr "Limpiar"
msgid "Monitors" msgid "Monitors"
msgstr "Monitores" msgstr "Monitores"
@ -1130,9 +1134,6 @@ msgstr "Detener"
msgid "Start" msgid "Start"
msgstr "Iniciar" msgstr "Iniciar"
msgid "Clear"
msgstr "Limpiar"
msgid "Measure:" msgid "Measure:"
msgstr "Medida:" msgstr "Medida:"
@ -1376,12 +1377,6 @@ msgstr "Es Dueño De"
msgid "Resources Without Explicit Ownership:" msgid "Resources Without Explicit Ownership:"
msgstr "Recursos Sin Propietario Explícito:" 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!" msgid "Thanks from the Godot community!"
msgstr "Gracias de parte de la comunidad Godot!" msgstr "Gracias de parte de la comunidad Godot!"
@ -1542,12 +1537,6 @@ msgstr "Ubicación para el Nuevo Layout..."
msgid "Open Audio Bus Layout" msgid "Open Audio Bus Layout"
msgstr "Abrir Layout de Bus de Audio" 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" msgid "Error saving file: %s"
msgstr "Error guardando el archivo: %s" msgstr "Error guardando el archivo: %s"
@ -1887,20 +1876,14 @@ msgstr ""
msgid "Editor" msgid "Editor"
msgstr "Editor" msgstr "Editor"
msgid "Property:" msgid "Show in FileSystem"
msgstr "Propiedad:" msgstr "Mostrar en Sistema de Archivos"
msgid "Signal:" msgid "Open in File Manager"
msgstr "Señal:" msgstr "Abrir en el Explorador de Archivos"
msgid "%d matches." msgid "Class"
msgstr "%d coincidencias." msgstr "Clase"
msgid "Method"
msgstr "Método"
msgid "Signal"
msgstr "Señal"
msgid "Constant" msgid "Constant"
msgstr "Constante" msgstr "Constante"
@ -1911,6 +1894,18 @@ msgstr "Propiedad"
msgid "Theme Property" msgid "Theme Property"
msgstr "Propiedades del Tema" 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" msgid "Search Help"
msgstr "Buscar en la Ayuda" msgstr "Buscar en la Ayuda"
@ -1944,9 +1939,6 @@ msgstr "Solo Propiedades de Tema"
msgid "Member Type" msgid "Member Type"
msgstr "Tipo de Miembro" 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." msgid "Pinning a value forces it to be saved even if it's equal to the default."
msgstr "" msgstr ""
"Fijar un valor fuerza que sea guardado incluso si es igual predeterminado." "Fijar un valor fuerza que sea guardado incluso si es igual predeterminado."
@ -1966,8 +1958,8 @@ msgstr "Asignar %s"
msgid "Unpinned %s" msgid "Unpinned %s"
msgstr "Desfijado %s" msgstr "Desfijado %s"
msgid "Name:" msgid "Favorites"
msgstr "Nombre:" msgstr "Favoritos"
msgid "Copy Property Path" msgid "Copy Property Path"
msgstr "Copiar Ruta de Propiedad" msgstr "Copiar Ruta de Propiedad"
@ -2094,15 +2086,6 @@ msgstr ""
msgid "Open Base Scene" msgid "Open Base Scene"
msgstr "Abrir Escena Base" 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 "" msgid ""
"A root node is required to save the scene. You can add a root node using the " "A root node is required to save the scene. You can add a root node using the "
"Scene tree dock." "Scene tree dock."
@ -2113,9 +2096,6 @@ msgstr ""
msgid "Save Scene As..." msgid "Save Scene As..."
msgstr "Guardar Escena Como..." 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." msgid "Can't undo while mouse buttons are pressed."
msgstr "No se puede deshacer mientras los botones del mouse están presionados." 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" msgid "Clear Recent Scenes"
msgstr "Restablecer Escenas Recientes" 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" msgid "Default"
msgstr "Por Defecto" msgstr "Por Defecto"
@ -2287,6 +2239,15 @@ msgstr "Abrir Reciente"
msgid "Save Scene" msgid "Save Scene"
msgstr "Guardar Escena" 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..." msgid "MeshLibrary..."
msgstr "MeshLibrary..." msgstr "MeshLibrary..."
@ -2409,13 +2370,6 @@ msgstr "Exportar Libreria"
msgid "Open & Run a Script" msgid "Open & Run a Script"
msgstr "Abrir y Correr un 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" msgid "New Inherited"
msgstr "Nuevo Heredado" msgstr "Nuevo Heredado"
@ -2525,9 +2479,6 @@ msgstr "Convertir en Unico"
msgid "Save As..." msgid "Save As..."
msgstr "Guardar Como..." msgstr "Guardar Como..."
msgid "Show in FileSystem"
msgstr "Mostrar en Sistema de Archivos"
msgid "Convert to %s" msgid "Convert to %s"
msgstr "Convertir a %s" msgstr "Convertir a %s"
@ -2549,6 +2500,9 @@ msgstr ""
msgid "Write your logic in the _run() method." msgid "Write your logic in the _run() method."
msgstr "Escribir tu lógica en el método _run()." msgstr "Escribir tu lógica en el método _run()."
msgid "None"
msgstr "Ninguno"
msgid "Editor Settings" msgid "Editor Settings"
msgstr "Configuración del Editor" msgstr "Configuración del Editor"
@ -2741,6 +2695,16 @@ msgstr "Importando:"
msgid "Remove templates for the version '%s'?" msgid "Remove templates for the version '%s'?"
msgstr "¿Quitar plantillas para la versión '%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" msgid "Uncompressing Android Build Sources"
msgstr "Descomprimiendo Fuentes de Compilación Android" msgstr "Descomprimiendo Fuentes de Compilación Android"
@ -2750,11 +2714,6 @@ msgstr "Gestor de Plantillas de Exportación"
msgid "Current Version:" msgid "Current Version:"
msgstr "Version Actual:" 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." msgid "Export templates are installed and ready to be used."
msgstr "" msgstr ""
"Las plantillas de exportación están instaladas y listas para ser usadas." "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 " "Descargar e instalar plantillas para la versión actual de el mejor mirror "
"posible." "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" msgid "Install from File"
msgstr "Instalar desde Archivo" msgstr "Instalar desde Archivo"
@ -2930,9 +2884,6 @@ msgstr "Gestionar Plantillas de Exportación"
msgid "Browse" msgid "Browse"
msgstr "Examinar" msgstr "Examinar"
msgid "Favorites"
msgstr "Favoritos"
msgid "View items as a grid of thumbnails." msgid "View items as a grid of thumbnails."
msgstr "Ver ítems como una grilla de miniaturas." msgstr "Ver ítems como una grilla de miniaturas."
@ -2983,6 +2934,9 @@ msgstr "Duplicando archivo:"
msgid "Duplicating folder:" msgid "Duplicating folder:"
msgstr "Duplicando carpeta:" msgstr "Duplicando carpeta:"
msgid "Create Folder"
msgstr "Crear Carpeta"
msgid "New Inherited Scene" msgid "New Inherited Scene"
msgstr "Nueva Escena Heredada" msgstr "Nueva Escena Heredada"
@ -3004,9 +2958,6 @@ msgstr "Quitar de Favoritos"
msgid "Reimport" msgid "Reimport"
msgstr "Reimportar" msgstr "Reimportar"
msgid "Open in File Manager"
msgstr "Abrir en el Explorador de Archivos"
msgid "New Folder..." msgid "New Folder..."
msgstr "Nueva Carpeta..." msgstr "Nueva Carpeta..."
@ -3117,12 +3068,6 @@ msgstr "Seleccionar Carpeta Actual"
msgid "Select This Folder" msgid "Select This Folder"
msgstr "Seleccionar Esta Carpeta" msgstr "Seleccionar Esta Carpeta"
msgid "All Recognized"
msgstr "Todos Reconocidos"
msgid "All Files (*)"
msgstr "Todos los Archivos (*)"
msgid "Open a File" msgid "Open a File"
msgstr "Abrir un Archivo" msgstr "Abrir un Archivo"
@ -3138,6 +3083,9 @@ msgstr "Abrir un Archivo o Directorio"
msgid "Save a File" msgid "Save a File"
msgstr "Guardar un Archivo" msgstr "Guardar un Archivo"
msgid "Could not create folder."
msgstr "No se pudo crear la carpeta."
msgid "Go Back" msgid "Go Back"
msgstr "Retroceder" msgstr "Retroceder"
@ -3180,12 +3128,12 @@ msgstr "Refrescar archivos."
msgid "(Un)favorite current folder." msgid "(Un)favorite current folder."
msgstr "Quitar carpeta actual de favoritos." msgstr "Quitar carpeta actual de favoritos."
msgid "Toggle the visibility of hidden files."
msgstr "Mostrar/Ocultar archivos ocultos."
msgid "Directories & Files:" msgid "Directories & Files:"
msgstr "Directorios y Archivos:" msgstr "Directorios y Archivos:"
msgid "Toggle the visibility of hidden files."
msgstr "Mostrar/Ocultar archivos ocultos."
msgid "Preview:" msgid "Preview:"
msgstr "Vista Previa:" msgstr "Vista Previa:"
@ -3204,8 +3152,8 @@ msgstr "Reproducir el proyecto."
msgid "Play the edited scene." msgid "Play the edited scene."
msgstr "Reproducir la escena editada." msgstr "Reproducir la escena editada."
msgid "Quick Run Scene..." msgid "Network Profiler"
msgstr "Ejecución Rápida de Escena..." msgstr "Profiler de Red"
msgid "Run Project" msgid "Run Project"
msgstr "Reproducir Proyecto" msgstr "Reproducir Proyecto"
@ -3392,18 +3340,9 @@ msgstr "Abrir la documentación para este objeto."
msgid "Manage object properties." msgid "Manage object properties."
msgstr "Administrar propiedades del objeto." msgstr "Administrar propiedades del objeto."
msgid "Add %d Translations"
msgstr "Añadir %d Traducciones"
msgid "Remove Translation" msgid "Remove Translation"
msgstr "Quitar Traducción" 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" msgid "Change Resource Remap Language"
msgstr "Cambiar Lenguaje de Remapeo de Recursos" msgstr "Cambiar Lenguaje de Remapeo de Recursos"
@ -3658,20 +3597,6 @@ msgstr "Blendear Próximo Cambiado"
msgid "Change Blend Time" msgid "Change Blend Time"
msgstr "Cambiar Tiempo de Blend" 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)." msgid "Animation position (in seconds)."
msgstr "Posición de animación (en segundos)." msgstr "Posición de animación (en segundos)."
@ -3732,9 +3657,6 @@ msgstr "Incluir Gizmos (3D)"
msgid "Pin AnimationPlayer" msgid "Pin AnimationPlayer"
msgstr "Fijar AnimationPlayer" msgstr "Fijar AnimationPlayer"
msgid "Error!"
msgstr "Error!"
msgid "Cross-Animation Blend Times" msgid "Cross-Animation Blend Times"
msgstr "Tiempos de Blending Entre Animaciones" msgstr "Tiempos de Blending Entre Animaciones"
@ -4017,23 +3939,6 @@ msgstr "Bloqueado"
msgid "Grouped" msgid "Grouped"
msgstr "Agrupado" 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" msgid "Lock Selected"
msgstr "Bloqueo Seleccionado" msgstr "Bloqueo Seleccionado"
@ -4309,30 +4214,6 @@ msgstr "Derecha Ancha"
msgid "Full Rect" msgid "Full Rect"
msgstr "Todo el 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" msgid "Load Curve Preset"
msgstr "Cargar Preset de Curva" msgstr "Cargar Preset de Curva"
@ -4473,39 +4354,6 @@ msgstr "Cambiar Radio de Luces"
msgid "Change Notifier AABB" msgid "Change Notifier AABB"
msgstr "Cambiar Notificador 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" msgid "Create Occluder Polygon"
msgstr "Crear Polígono Oclusor" msgstr "Crear Polígono Oclusor"
@ -4517,11 +4365,6 @@ msgstr ""
"lightmaps.\n" "lightmaps.\n"
"Guardá tu escena e inténtalo de nuevo." "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" msgid "Bake Lightmaps"
msgstr "Bake Lightmaps" msgstr "Bake Lightmaps"
@ -4537,9 +4380,6 @@ msgstr "No se pudo crear ninguna forma de colisión."
msgid "Mesh is empty!" msgid "Mesh is empty!"
msgstr "¡El Mesh está vacío!" msgstr "¡El Mesh está vacío!"
msgid "Create Navigation Mesh"
msgstr "Crear Navigation Mesh"
msgid "Contained Mesh is not of type ArrayMesh." msgid "Contained Mesh is not of type ArrayMesh."
msgstr "El Mesh contenedor no es del tipo 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." msgid "Mesh has no UV in layer %d."
msgstr "La malla no tiene UV en la capa %d." msgstr "La malla no tiene UV en la capa %d."
msgid "Create Navigation Mesh"
msgstr "Crear Navigation Mesh"
msgid "Create Outline" msgid "Create Outline"
msgstr "Crear Outline" msgstr "Crear Outline"
@ -4706,11 +4549,8 @@ msgstr "Cantidad:"
msgid "Populate" msgid "Populate"
msgstr "Poblar" msgstr "Poblar"
msgid "Edit Poly" msgid "Please Confirm..."
msgstr "Editar Polígono" msgstr "Confirmá, por favor..."
msgid "Edit Poly (Remove Point)"
msgstr "Editar Polígono (Remover Punto)"
msgid "Create Navigation Polygon" msgid "Create Navigation Polygon"
msgstr "Crear Polígono de Navegación" msgstr "Crear Polígono de Navegación"
@ -4763,9 +4603,6 @@ msgstr "Ortogonal Trasera"
msgid "Rear Perspective" msgid "Rear Perspective"
msgstr "Perspectiva Trasera" msgstr "Perspectiva Trasera"
msgid " [auto]"
msgstr " [auto]"
msgid "X-Axis Transform." msgid "X-Axis Transform."
msgstr "Transformación en Eje-X." msgstr "Transformación en Eje-X."
@ -4808,9 +4645,6 @@ msgstr "Alinear Transform con Vista"
msgid "Align Rotation with View" msgid "Align Rotation with View"
msgstr "Alinear Rotación con Vista" msgstr "Alinear Rotación con Vista"
msgid "None"
msgstr "Ninguno"
msgid "Rotate" msgid "Rotate"
msgstr "Rotar" msgstr "Rotar"
@ -5059,6 +4893,63 @@ msgstr "Pre"
msgid "Post" msgid "Post"
msgstr "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" msgid "Remove Point from Curve"
msgstr "Remover Punto de Curva" msgstr "Remover Punto de Curva"
@ -5095,9 +4986,6 @@ msgstr "Eliminar Punto"
msgid "Close Curve" msgid "Close Curve"
msgstr "Cerrar Curva" msgstr "Cerrar Curva"
msgid "Please Confirm..."
msgstr "Confirmá, por favor..."
msgid "Mirror Handle Angles" msgid "Mirror Handle Angles"
msgstr "Manejadores de Ángulos de Espejo" 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" msgid "Sync Bones"
msgstr "Sincronizar Huesos" 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" msgid "Create UV Map"
msgstr "Crear Mapa UV" msgstr "Crear Mapa UV"
@ -5200,21 +5081,15 @@ msgstr "Transformar Polígono"
msgid "Paint Bone Weights" msgid "Paint Bone Weights"
msgstr "Pintar Peso de Huesos" 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" msgid "Points"
msgstr "Puntos" msgstr "Puntos"
msgid "Polygons" msgid "Polygons"
msgstr "Polígonos" msgstr "Polígonos"
msgid "UV"
msgstr "UV"
msgid "Bones" msgid "Bones"
msgstr "Huesos" msgstr "Huesos"
@ -5289,6 +5164,12 @@ msgstr "Sincronizar Huesos con el Polígono"
msgid "Create Polygon3D" msgid "Create Polygon3D"
msgstr "Crear 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!" msgid "ERROR: Couldn't load resource!"
msgstr "ERROR: No se pudo cargar el recurso!" msgstr "ERROR: No se pudo cargar el recurso!"
@ -5367,9 +5248,6 @@ msgstr "Script Siguiente"
msgid "Previous Script" msgid "Previous Script"
msgstr "Script Anterior" msgstr "Script Anterior"
msgid "File"
msgstr "Archivo"
msgid "Open..." msgid "Open..."
msgstr "Abrir..." msgstr "Abrir..."
@ -5460,9 +5338,6 @@ msgstr "[Ignorar]"
msgid "Go to Function" msgid "Go to Function"
msgstr "Ir a Función" msgstr "Ir a Función"
msgid "Lookup Symbol"
msgstr "Buscar Símbolo"
msgid "Pick Color" msgid "Pick Color"
msgstr "Seleccionar Color" msgstr "Seleccionar Color"
@ -5541,6 +5416,9 @@ msgstr "Ir a Función..."
msgid "Go to Line..." msgid "Go to Line..."
msgstr "Ir a Línea..." msgstr "Ir a Línea..."
msgid "Lookup Symbol"
msgstr "Buscar Símbolo"
msgid "Toggle Breakpoint" msgid "Toggle Breakpoint"
msgstr "Act/Desact. Breakpoint" msgstr "Act/Desact. Breakpoint"
@ -5658,6 +5536,20 @@ msgstr "Animaciones:"
msgid "Animation Frames:" msgid "Animation Frames:"
msgstr "Fotogramas de animación:" 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" msgid "Zoom Reset"
msgstr "Reset de Zoom" msgstr "Reset de Zoom"
@ -5667,6 +5559,9 @@ msgstr "Seleccionar Frames"
msgid "Size" msgid "Size"
msgstr "Tamaño" msgstr "Tamaño"
msgid "Auto Slice"
msgstr "Corte Automático"
msgid "Create Frames from Sprite Sheet" msgid "Create Frames from Sprite Sheet"
msgstr "Crear Frames a partir de Sprite Sheet" msgstr "Crear Frames a partir de Sprite Sheet"
@ -5691,9 +5586,6 @@ msgstr "Ajustar a Pixeles"
msgid "Grid Snap" msgid "Grid Snap"
msgstr "Ajustar a Grilla" msgstr "Ajustar a Grilla"
msgid "Auto Slice"
msgstr "Corte Automático"
msgid "Step:" msgid "Step:"
msgstr "Paso:" 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:" msgid "The following files failed extraction from package:"
msgstr "Los siguientes archivos no se pudieron extraer del paquete:" 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:" msgid "Install Project:"
msgstr "Instalar Proyecto:" msgstr "Instalar Proyecto:"
msgid "Install & Edit"
msgstr "Instalar y Editar"
msgid "Project Name:" msgid "Project Name:"
msgstr "Nombre del Proyecto:" msgstr "Nombre del Proyecto:"
@ -7309,36 +7192,12 @@ msgstr "Ruta base inválida."
msgid "Wrong extension chosen." msgid "Wrong extension chosen."
msgstr "Extensión incorrecta elegida." 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" msgid "Change Torus Inner Radius"
msgstr "Cambiar Radio Interno de Toro" msgstr "Cambiar Radio Interno de Toro"
msgid "Change Torus Outer Radius" msgid "Change Torus Outer Radius"
msgstr "Cambiar Radio Externo de Toro" 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" msgid "GridMap Delete Selection"
msgstr "Eliminar Seleccionados en GridMap" msgstr "Eliminar Seleccionados en GridMap"
@ -7354,6 +7213,12 @@ msgstr "Pintar GridMap"
msgid "GridMap Selection" msgid "GridMap Selection"
msgstr "Selección de GridMap" msgstr "Selección de GridMap"
msgid "Previous Floor"
msgstr "Piso Anterior"
msgid "Next Floor"
msgstr "Piso Siguiente"
msgid "Edit X Axis" msgid "Edit X Axis"
msgstr "Editar Eje X" msgstr "Editar Eje X"
@ -7363,6 +7228,12 @@ msgstr "Editar Eje Y"
msgid "Edit Z Axis" msgid "Edit Z Axis"
msgstr "Editar Eje Z" msgstr "Editar Eje Z"
msgid "GridMap Settings"
msgstr "Ajustes de GridMap"
msgid "Pick Distance:"
msgstr "Elegir Instancia:"
msgid "Cursor Rotate X" msgid "Cursor Rotate X"
msgstr "Rotar X en Cursor" msgstr "Rotar X en Cursor"
@ -7372,39 +7243,6 @@ msgstr "Rotar Y en Cursor"
msgid "Cursor Rotate Z" msgid "Cursor Rotate Z"
msgstr "Rotar Z en Cursor" 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." msgid "Give a MeshLibrary resource to this GridMap to use its meshes."
msgstr "Asignar un recurso MeshLibrary a este GridMap para usar sus meshes." msgstr "Asignar un recurso MeshLibrary a este GridMap para usar sus meshes."
@ -7430,9 +7268,6 @@ msgstr "RPC Saliente"
msgid "Config" msgid "Config"
msgstr "Configuraciones" msgstr "Configuraciones"
msgid "Network Profiler"
msgstr "Profiler de Red"
msgid "A NavigationMesh resource must be set or created for this node to work." msgid "A NavigationMesh resource must be set or created for this node to work."
msgstr "" msgstr ""
"Se debe crear o setear un recurso NavigationMesh para que este nodo funcione." "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 "" msgstr ""
"No se pudo encontrar el comando apksigner en las Android SDK build-tools." "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." msgid "Could not find keystore, unable to export."
msgstr "No se pudo encontrar la keystore, no se puedo exportar." msgstr "No se pudo encontrar la keystore, no se puedo exportar."
msgid "'apksigner' returned with error #%d" msgid "'apksigner' returned with error #%d"
msgstr "'apksigner' ha retornado con 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" msgid "Exporting for Android"
msgstr "Exportando para Android" msgstr "Exportando para Android"
@ -7768,14 +7583,6 @@ msgstr ""
"Se debe proveer un shape para que CollisionShape2D funcione. Creale un " "Se debe proveer un shape para que CollisionShape2D funcione. Creale un "
"recurso shape!" "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" msgid "Node A and Node B must be PhysicsBody2Ds"
msgstr "El nodo A y el nodo B deben ser PhysicsBody2D" 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. # ninjum <ninhum@gmx.com>, 2024.
# spukes <soyceltista@hotmail.com>, 2024. # spukes <soyceltista@hotmail.com>, 2024.
# "Aquiles T. M." <aquiles.sonido@gmail.com>, 2024. # "Aquiles T. M." <aquiles.sonido@gmail.com>, 2024.
# Guachipoto <guachipoto993@gmail.com>, 2024.
# "Miguel A. Bouzada" <mbouzada@gmail.com>, 2025.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Godot Engine editor interface\n" "Project-Id-Version: Godot Engine editor interface\n"
"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n"
"PO-Revision-Date: 2024-09-05 14:09+0000\n" "PO-Revision-Date: 2025-02-06 23:02+0000\n"
"Last-Translator: \"Aquiles T. M.\" <aquiles.sonido@gmail.com>\n" "Last-Translator: \"Miguel A. Bouzada\" <mbouzada@gmail.com>\n"
"Language-Team: Galician <https://hosted.weblate.org/projects/godot-engine/" "Language-Team: Galician <https://hosted.weblate.org/projects/godot-engine/"
"godot/gl/>\n" "godot/gl/>\n"
"Language: gl\n" "Language: gl\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8-bit\n" "Content-Transfer-Encoding: 8-bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\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" msgid "Main Thread"
msgstr "Fío principal" msgstr "Fío principal"
@ -38,49 +40,49 @@ msgid "Physical"
msgstr "Físico" msgstr "Físico"
msgid "Left Mouse Button" msgid "Left Mouse Button"
msgstr "Botón Esquerdo do Rato" msgstr "Botón esquerdo do rato"
msgid "Right Mouse Button" msgid "Right Mouse Button"
msgstr "Botón Dereito do Rato" msgstr "Botón dereito do rato"
msgid "Middle Mouse Button" msgid "Middle Mouse Button"
msgstr "Botón Central do Rato" msgstr "Botón central do rato"
msgid "Mouse Wheel Up" msgid "Mouse Wheel Up"
msgstr "Roda do Rato Cara Arriba" msgstr "Roda do rato cara arriba"
msgid "Mouse Wheel Down" msgid "Mouse Wheel Down"
msgstr "Roda do Rato Cara Abaixo" msgstr "Roda do rato cara abaixo"
msgid "Mouse Wheel Left" msgid "Mouse Wheel Left"
msgstr "Roda do Rato Cara a Esquerda" msgstr "Roda do rato cara a esquerda"
msgid "Mouse Wheel Right" msgid "Mouse Wheel Right"
msgstr "Roda do Rato Cara a Dereita" msgstr "Roda do rato cara a dereita"
msgid "Mouse Thumb Button 1" 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" msgid "Mouse Thumb Button 2"
msgstr "Botón do Rato Polgar 2" msgstr "Botón de Polgar do Rato 2"
msgid "Button" msgid "Button"
msgstr "Botón" msgstr "Botón"
msgid "Double Click" msgid "Double Click"
msgstr "Dobre clic" msgstr "Duplo Clic"
msgid "Mouse motion at position (%s) with velocity (%s)" msgid "Mouse motion at position (%s) with velocity (%s)"
msgstr "Movemento do rato na posición (%s) con velocidade (%s)" msgstr "Movemento do rato na posición (%s) con velocidade (%s)"
msgid "Left Stick X-Axis, Joystick 0 X-Axis" 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" 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" 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" msgid "Right Stick Y-Axis, Joystick 1 Y-Axis"
msgstr "Eixe Y da Panca Dereita, Eixe Y do Joystick 1" msgstr "Eixe Y da Panca Dereita, Eixe Y do Joystick 1"
@ -488,6 +490,12 @@ msgstr "Acción"
msgid "Deadzone" msgid "Deadzone"
msgstr "Zona morta" msgstr "Zona morta"
msgid "Name:"
msgstr "Nome:"
msgid "Type:"
msgstr "Tipo:"
msgid "Time:" msgid "Time:"
msgstr "Tempo:" msgstr "Tempo:"
@ -599,15 +607,6 @@ msgstr "Cambiar Lonxitude da Animación"
msgid "Change Animation Loop" msgid "Change Animation Loop"
msgstr "Cambiar Ciclo da Animación" 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..." msgid "Property Track..."
msgstr "Pista de Propiedades..." msgstr "Pista de Propiedades..."
@ -692,9 +691,6 @@ msgstr "Escala:"
msgid "Blend Shape:" msgid "Blend Shape:"
msgstr "Forma Combinada:" msgstr "Forma Combinada:"
msgid "Type:"
msgstr "Tipo:"
msgid "(Invalid, expected type: %s)" msgid "(Invalid, expected type: %s)"
msgstr "(Inválido, tipo esperado: %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." msgid "Group tracks by node or display them as plain list."
msgstr "Agrupar pistas por nodo ou mostralas coma unha simple lista." msgstr "Agrupar pistas por nodo ou mostralas coma unha simple lista."
msgid "Snap:"
msgstr "Axuste de Cuadrícula:"
msgid "Animation step value." msgid "Animation step value."
msgstr "Valor de paso de animación." msgstr "Valor de paso de animación."
@ -1103,6 +1096,12 @@ msgstr "Seleccionar Todas/Ningunha"
msgid "Animation Change Keyframe Time" msgid "Animation Change Keyframe Time"
msgstr "Cambiar Tempo do Fotograma Clave da Animación" msgstr "Cambiar Tempo do Fotograma Clave da Animación"
msgid "Close"
msgstr "Pechar"
msgid "Error!"
msgstr "Erro!"
msgid "Add Audio Track Clip" msgid "Add Audio Track Clip"
msgstr "Engadir Clip de Pista de Audio" 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" msgid "Cannot connect signal"
msgstr "No se pode conectar a sinal" msgstr "No se pode conectar a sinal"
msgid "Close"
msgstr "Pechar"
msgid "Connect" msgid "Connect"
msgstr "Conectar" msgstr "Conectar"
@ -1348,6 +1344,9 @@ msgstr "Copiar Ruta do Nodo"
msgid "Instance:" msgid "Instance:"
msgstr "Instancia:" msgstr "Instancia:"
msgid "Clear"
msgstr "Limpar"
msgid "Decompressing remote file system" msgid "Decompressing remote file system"
msgstr "Descomprimindo sistema de ficheiros remoto" msgstr "Descomprimindo sistema de ficheiros remoto"
@ -1372,9 +1371,6 @@ msgstr "Deter"
msgid "Start" msgid "Start"
msgstr "Iniciar" msgstr "Iniciar"
msgid "Clear"
msgstr "Limpar"
msgid "Measure:" msgid "Measure:"
msgstr "Medida:" msgstr "Medida:"
@ -1595,27 +1591,12 @@ msgstr "O nome do cartafol non pode estar baleiro."
msgid "Folder name contains invalid characters." msgid "Folder name contains invalid characters."
msgstr "O nome do cartafol contén caracteres non válidos." 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." msgid "File with that name already exists."
msgstr "Un ficheiro con ese nome xa existe." msgstr "Un ficheiro con ese nome xa existe."
msgid "Folder with that name already exists." msgid "Folder with that name already exists."
msgstr "Un cartafol con ese nome xa existe." 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." msgid "Folder name is valid."
msgstr "O nome do cartafol é válido." msgstr "O nome do cartafol é válido."
@ -1625,9 +1606,6 @@ msgstr "Dobre-clic para abrir no navegador."
msgid "Thanks from the Godot community!" msgid "Thanks from the Godot community!"
msgstr "Moitas grazas de parte da comunidade de Godot!" msgstr "Moitas grazas de parte da comunidade de Godot!"
msgid "(unknown)"
msgstr "(descoñecido)"
msgid "Godot Engine contributors" msgid "Godot Engine contributors"
msgstr "Colaboradores de Godot Engine" msgstr "Colaboradores de Godot Engine"
@ -1810,18 +1788,12 @@ msgstr "Localización para a Nova Disposición..."
msgid "Open Audio Bus Layout" msgid "Open Audio Bus Layout"
msgstr "Abrir Disposición do Bus de Son" msgstr "Abrir Disposición do Bus de Son"
msgid "There is no '%s' file." msgid "Error saving file: %s"
msgstr "Non hai ningún arquivo '%s'." msgstr "Erro gardando o arquivo: %s"
msgid "Layout:" msgid "Layout:"
msgstr "Disposición:" 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" msgid "Add Bus"
msgstr "Engadir Bus" msgstr "Engadir Bus"
@ -2179,20 +2151,14 @@ msgstr ""
msgid "Editor" msgid "Editor"
msgstr "Editor" msgstr "Editor"
msgid "Property:" msgid "Show in FileSystem"
msgstr "Propiedade:" msgstr "Amosar no Sistema de Arquivos"
msgid "Signal:" msgid "Open in File Manager"
msgstr "Sinal:" msgstr "Abrir no Explorador de Arquivos"
msgid "%d matches." msgid "Class"
msgstr "%d coincidencias." msgstr "Clase"
msgid "Method"
msgstr "Método"
msgid "Signal"
msgstr "Sinal"
msgid "Constant" msgid "Constant"
msgstr "Constante" msgstr "Constante"
@ -2203,6 +2169,18 @@ msgstr "Propiedade"
msgid "Theme Property" msgid "Theme Property"
msgstr "Propiedade de Temas" 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" msgid "Search Help"
msgstr "Buscar na Axuda" msgstr "Buscar na Axuda"
@ -2236,9 +2214,6 @@ msgstr "Só Propiedades de Temas"
msgid "Member Type" msgid "Member Type"
msgstr "Tipo do Membro" msgstr "Tipo do Membro"
msgid "Class"
msgstr "Clase"
msgid "(%d change)" msgid "(%d change)"
msgid_plural "(%d changes)" msgid_plural "(%d changes)"
msgstr[0] "(% cambio)" msgstr[0] "(% cambio)"
@ -2247,8 +2222,8 @@ msgstr[1] "(% cambios)"
msgid "Resize Array" msgid "Resize Array"
msgstr "Redimensionar Array" msgstr "Redimensionar Array"
msgid "Name:" msgid "Favorites"
msgstr "Nome:" msgstr "Favoritos"
msgid "Creating Mesh Previews" msgid "Creating Mesh Previews"
msgstr "Creando Previsualización de Mallas" msgstr "Creando Previsualización de Mallas"
@ -2367,21 +2342,9 @@ msgstr ""
msgid "Open Base Scene" msgid "Open Base Scene"
msgstr "Abrir Escena Base" 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..." msgid "Save Scene As..."
msgstr "Gardar Escena Como..." 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." msgid "Can't reload a scene that was never saved."
msgstr "Non se pode volver a cargar unha escena que nunca foi gardada." 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" msgid "Clear Recent Scenes"
msgstr "Limpar Escenas Recentes" 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" msgid "Default"
msgstr "Por Defecto" msgstr "Por Defecto"
@ -2528,6 +2463,15 @@ msgstr "Abrir Recente"
msgid "Save Scene" msgid "Save Scene"
msgstr "Gardar Escena" 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" msgid "Close Scene"
msgstr "Pechar Escena" msgstr "Pechar Escena"
@ -2707,9 +2651,6 @@ msgstr "Facer Único"
msgid "Save As..." msgid "Save As..."
msgstr "Gardar Como..." msgstr "Gardar Como..."
msgid "Show in FileSystem"
msgstr "Amosar no Sistema de Arquivos"
msgid "New %s" msgid "New %s"
msgstr "Novo %s" msgstr "Novo %s"
@ -2728,6 +2669,9 @@ msgstr ""
msgid "Write your logic in the _run() method." msgid "Write your logic in the _run() method."
msgstr "Escribe a túa lóxica no método '_run()'." msgstr "Escribe a túa lóxica no método '_run()'."
msgid "None"
msgstr "Ningún"
msgid "General" msgid "General"
msgstr "Xeral" msgstr "Xeral"
@ -2833,9 +2777,6 @@ msgstr "Características"
msgid "Browse" msgid "Browse"
msgstr "Examinar" msgstr "Examinar"
msgid "Favorites"
msgstr "Favoritos"
msgid "View items as a grid of thumbnails." msgid "View items as a grid of thumbnails."
msgstr "Ver elementos coma unha cuadrícula de miniaturas." msgstr "Ver elementos coma unha cuadrícula de miniaturas."
@ -2872,6 +2813,9 @@ msgstr "Duplicando Arquivo:"
msgid "Duplicating folder:" msgid "Duplicating folder:"
msgstr "Duplicando Cartafol:" msgstr "Duplicando Cartafol:"
msgid "Create Folder"
msgstr "Crear Cartafol"
msgid "New Inherited Scene" msgid "New Inherited Scene"
msgstr "Nova Escena Herdada" msgstr "Nova Escena Herdada"
@ -2893,9 +2837,6 @@ msgstr "Eliminar de Favoritos"
msgid "Reimport" msgid "Reimport"
msgstr "Reimportar" msgstr "Reimportar"
msgid "Open in File Manager"
msgstr "Abrir no Explorador de Arquivos"
msgid "New Folder..." msgid "New Folder..."
msgstr "Novo Cartafol..." msgstr "Novo Cartafol..."
@ -3022,12 +2963,6 @@ msgstr ""
msgid "Select This Folder" msgid "Select This Folder"
msgstr "Seleccionar Este Cartafol" msgstr "Seleccionar Este Cartafol"
msgid "All Recognized"
msgstr "Todos Recoñecidos"
msgid "All Files (*)"
msgstr "Todos os Arquivos (*)"
msgid "Open a File" msgid "Open a File"
msgstr "Abrir un Arquivo" msgstr "Abrir un Arquivo"
@ -3046,6 +2981,9 @@ msgstr "Gardar un Arquivo"
msgid "Could not create folder. File with that name already exists." 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." 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" msgid "Go Back"
msgstr "Retroceder" msgstr "Retroceder"
@ -3085,12 +3023,12 @@ msgstr "Actualizar Arquivos."
msgid "(Un)favorite current folder." msgid "(Un)favorite current folder."
msgstr "Quitar cartafol actual de favoritos." msgstr "Quitar cartafol actual de favoritos."
msgid "Toggle the visibility of hidden files."
msgstr "Amosar/Ocultar arquivos ocultos."
msgid "Directories & Files:" msgid "Directories & Files:"
msgstr "Directorios e Arquivos:" msgstr "Directorios e Arquivos:"
msgid "Toggle the visibility of hidden files."
msgstr "Amosar/Ocultar arquivos ocultos."
msgid "Preview:" msgid "Preview:"
msgstr "Vista Previa:" msgstr "Vista Previa:"
@ -3106,8 +3044,8 @@ msgstr "Reproduce o proxecto."
msgid "Play the edited scene." msgid "Play the edited scene."
msgstr "Reproduce a escena actual." msgstr "Reproduce a escena actual."
msgid "Quick Run Scene..." msgid "Network Profiler"
msgstr "Execución Rápida de Escena..." msgstr "Analítica de Rendemento de Rede"
msgid "Play This Scene" msgid "Play This Scene"
msgstr "Reproducir Esta Escena" msgstr "Reproducir Esta Escena"
@ -3140,6 +3078,9 @@ msgstr ""
"Mantén pulsado %s para redondear a enteiros. \n" "Mantén pulsado %s para redondear a enteiros. \n"
"Mantén pulsado Shift para cambios máis precisos." "Mantén pulsado Shift para cambios máis precisos."
msgid "(unknown)"
msgstr "(descoñecido)"
msgid "Unlock Node" msgid "Unlock Node"
msgstr "Desbloquear Nodo" msgstr "Desbloquear Nodo"
@ -3374,9 +3315,6 @@ msgstr "Futuro"
msgid "Depth" msgid "Depth"
msgstr "Profundidad" msgstr "Profundidad"
msgid "Error!"
msgstr "Erro!"
msgid "Move Node" msgid "Move Node"
msgstr "Mover Nodo" msgstr "Mover Nodo"
@ -3816,21 +3754,6 @@ msgstr "Editar Característica Adicional (Plugin)"
msgid "Installed Plugins:" msgid "Installed Plugins:"
msgstr "Características Adicionais (Plugins) Instalados:" 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?" msgid "UV Unwrap failed, mesh may not be manifold?"
msgstr "" msgstr ""
"Produciuse un erro no desenvoltura UV, é posible que a malla non sexa " "Produciuse un erro no desenvoltura UV, é posible que a malla non sexa "
@ -3883,11 +3806,8 @@ msgstr "Cantidade:"
msgid "Populate" msgid "Populate"
msgstr "Encher" msgstr "Encher"
msgid "Edit Poly" msgid "Please Confirm..."
msgstr "Editar Polígono" msgstr "Por favor, confirma..."
msgid "Edit Poly (Remove Point)"
msgstr "Editar Polígono (Eliminar Punto)"
msgid "Orthogonal" msgid "Orthogonal"
msgstr "Ortogonal" msgstr "Ortogonal"
@ -3922,9 +3842,6 @@ msgstr "Aliñar Transformación con Perspectiva"
msgid "Align Rotation with View" msgid "Align Rotation with View"
msgstr "Aliñar Rotación con Perspectiva" msgstr "Aliñar Rotación con Perspectiva"
msgid "None"
msgstr "Ningún"
msgid "Rotating %s degrees." msgid "Rotating %s degrees."
msgstr "Rotando %s graos." msgstr "Rotando %s graos."
@ -4098,12 +4015,21 @@ msgstr "Anterior (Pre)"
msgid "Post" msgid "Post"
msgstr "Posterior (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" msgid "Delete Point"
msgstr "Eliminar Puntos" msgstr "Eliminar Puntos"
msgid "Please Confirm..."
msgstr "Por favor, confirma..."
msgid "Edit a Plugin" msgid "Edit a Plugin"
msgstr "Editar unha Característica Adicional (Plugin)" msgstr "Editar unha Característica Adicional (Plugin)"
@ -4125,13 +4051,6 @@ msgstr "Nome do Script:"
msgid "Activate now?" msgid "Activate now?"
msgstr "Activar agora?" 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" msgid "Create UV Map"
msgstr "Crear Mapa UV" msgstr "Crear Mapa UV"
@ -4154,21 +4073,15 @@ msgstr "Eliminar Polígono Personalizado"
msgid "Transform UV Map" msgid "Transform UV Map"
msgstr "Transformar Mapa UV" 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" msgid "Points"
msgstr "Puntos" msgstr "Puntos"
msgid "Polygons" msgid "Polygons"
msgstr "Polígonos" msgstr "Polígonos"
msgid "UV"
msgstr "UV"
msgid "Bones" msgid "Bones"
msgstr "Ósos" msgstr "Ósos"
@ -4205,6 +4118,12 @@ msgstr "Amosar Cuadrícula"
msgid "Configure Grid:" msgid "Configure Grid:"
msgstr "Configurar Cuadrícula:" 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" msgid "Add Resource"
msgstr "Engadir Recurso" msgstr "Engadir Recurso"
@ -4254,9 +4173,6 @@ msgstr "Atopar Anterior"
msgid "Sort" msgid "Sort"
msgstr "Ordenar" msgstr "Ordenar"
msgid "File"
msgstr "Arquivo"
msgid "Open..." msgid "Open..."
msgstr "Abrir..." 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:" msgid "The following files failed extraction from package:"
msgstr "Os seguintes arquivos non se poideron extraer do paquete:" 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:" msgid "Install Project:"
msgstr "Instalar Proxecto:" msgstr "Instalar Proxecto:"
msgid "Install & Edit"
msgstr "Instalar e Editar"
msgid "Project Name:" msgid "Project Name:"
msgstr "Nome do Proxecto:" msgstr "Nome do Proxecto:"
@ -4969,12 +4876,6 @@ msgstr "Ruta base inválida."
msgid "Wrong extension chosen." msgid "Wrong extension chosen."
msgstr "Extensión incorrecta elixida." msgstr "Extensión incorrecta elixida."
msgid "Plane:"
msgstr "Plano:"
msgid "Floor:"
msgstr "Chan:"
msgid "Plot direct lighting" msgid "Plot direct lighting"
msgstr "Colocar iluminación directa" msgstr "Colocar iluminación directa"
@ -4994,9 +4895,6 @@ msgstr "RPC Entrante"
msgid "Outgoing RPC" msgid "Outgoing RPC"
msgstr "RPC Saínte" msgstr "RPC Saínte"
msgid "Network Profiler"
msgstr "Analítica de Rendemento de Rede"
msgid "Delete Property?" msgid "Delete Property?"
msgstr "Eliminar Propiedad?" msgstr "Eliminar Propiedad?"
@ -5010,9 +4908,6 @@ msgstr ""
"O Keystore Release non está configurado correctamente nos axustes de " "O Keystore Release non está configurado correctamente nos axustes de "
"exportación." "exportación."
msgid "Signing release %s..."
msgstr "Asinando a versión %s..."
msgid "" msgid ""
"output: \n" "output: \n"
"%s" "%s"
@ -5039,14 +4934,6 @@ msgstr ""
"Engade un nodo CollisionShape2D ou CollisionPolygon2D como fillo para definir " "Engade un nodo CollisionShape2D ou CollisionPolygon2D como fillo para definir "
"a sua forma." "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" msgid "Node A and Node B must be PhysicsBody2Ds"
msgstr "Os nodo A e B teñen que ser do tipo PhysicsBody2D" msgstr "Os nodo A e B teñen que ser do tipo PhysicsBody2D"

View File

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